Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Abfrage über pdo stoppen

Das Hauptproblem besteht hier darin, die PID zwischen Ihrer asynchronen Anfrage, die den Bericht generiert, und dem Skript, das ihn stoppen soll, zu teilen.

Sie können Ihre PID erhalten mit:

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

Und Sie können so etwas wie php-shared-memory verwenden um eine gemeinsam genutzte Variable zwischen Ihren Skripts zu erstellen. Wenn Sie Composer nicht für Ihre Projektabhängigkeiten verwenden, hat diese Bibliothek eine eigenständige Version (1.5.0, hier ).

Implementierungsbeispiel:

<?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}");
    }
}