Mysql
 sql >> Base de données >  >> RDS >> Mysql

Arrêter la requête via pdo

Le principal problème ici est de partager le PID entre votre requête asynchrone qui génère le rapport et le script qui devrait l'arrêter.

Vous pouvez obtenir votre PID en utilisant :

    $stmt = $dbh->prepare("SELECT CONNECTION_ID()");
    $stmt->execute();
    $pid = $stmt->fetchColumn();

Et vous pouvez utiliser quelque chose comme php-shared-memory pour créer une variable partagée entre vos scripts. Si vous n'utilisez pas Composer pour les dépendances de votre projet, cette bibliothèque a une version autonome (1.5.0, ici ).

Exemple d'implémentation :

<?php

if (!include __DIR__ . '/vendor/autoload.php')
{
    die('You must set up the project dependencies.');
}

use Fuz\Component\SharedMemory\SharedMemory;
use Fuz\Component\SharedMemory\Storage\StorageFile;

// your intializations here

$storage = new StorageFile("/tmp/shared.{$user_id}.sync");
$shared = new SharedMemory($storage);

if (!isset($_POST['cancel_request']))
{
    $stmt = $dbh->prepare("SELECT CONNECTION_ID()");
    $stmt->execute();
    $pid = $stmt->fetchColumn();

    $shared->pid = $pid;

    // your long query here

    $shared->destroyStorage();
}
else
{
    // kills pid
    $pid = $shared->pid;
    if (!is_null($pid))
    {
        $dbh->exec("KILL {$pid}");
    }
}