Vấn đề chính ở đây là chia sẻ PID giữa yêu cầu không đồng bộ của bạn tạo ra báo cáo và tập lệnh sẽ ngăn chặn nó.
Bạn có thể lấy PID của mình bằng cách sử dụng:
$stmt = $dbh->prepare("SELECT CONNECTION_ID()");
$stmt->execute();
$pid = $stmt->fetchColumn();
Và bạn có thể sử dụng một cái gì đó như php-shared-memory để tạo một biến được chia sẻ giữa các tập lệnh của bạn. Nếu bạn không sử dụng Composer cho các bộ phận phụ thuộc vào dự án của mình, thì thư viện này có một bản phát hành độc lập (1.5.0, tại đây ).
Mẫu thực hiện:
<?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}");
}
}