Основният проблем тук е споделянето на PID между вашата асинхронна заявка, която генерира отчета, и скрипта, който трябва да го спре.
Можете да получите своя PID, като използвате:
$stmt = $dbh->prepare("SELECT CONNECTION_ID()");
$stmt->execute();
$pid = $stmt->fetchColumn();
И можете да използвате нещо като php-shared-memory за да създадете споделена променлива между вашите скриптове. Ако не използвате Composer за зависимостите на проекта си, тази библиотека има самостоятелна версия (1.5.0, тук ).
Пример за внедряване:
<?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}");
}
}