针对耗时任务(如发送电子邮件、图像处理等),我希望能运行异步PHP任务。在Linux系统上实现这一点相当容易,但我想要一个适用于Windows的方法。
我希望它很简单,不需要重装软件,也不需要使用SQL队列等工具,只需运行一个异步任务即可。
因此,我尝试了Symfony进程组件。问题是,同步运行任务正常,但异步运行时会随着主脚本退出。
是否有办法修复这个问题?
我希望它很简单,不需要重装软件,也不需要使用SQL队列等工具,只需运行一个异步任务即可。
因此,我尝试了Symfony进程组件。问题是,同步运行任务正常,但异步运行时会随着主脚本退出。
是否有办法修复这个问题?
composer require symfony/process
index.php
<?php
require './bootstrap.php';
$logFile = './log.txt';
file_put_contents($logFile, '');
append($logFile, 'script (A) : '.timestamp());
$process = new Process('php subscript.php');
$process->start(); // async, subscript exits prematurely…
//$process->run(); // sync, works fine
append($logFile, 'script (B) : '.timestamp());
subscript.php
<?php
require './bootstrap.php';
$logFile = './log.txt';
//ignore_user_abort(true); // doesn't solve issue…
append($logFile, 'subscript (A) : '.timestamp());
sleep(2);
append($logFile, 'subscript (B) : '.timestamp());
bootstrap.php
<?php
require './vendor/autoload.php';
class_alias('Symfony\Component\Process\Process', 'Process');
function append($file, $content) {
file_put_contents($file, $content."\n", FILE_APPEND);
}
function timestamp() {
list($usec, $sec) = explode(' ', microtime());
return date('H:i:s', $sec) . ' ' . sprintf('%03d', floor($usec * 1000));
}
结果
script (A) : 02:36:10 491
script (B) : 02:36:10 511
subscript (A) : 02:36:10 581
// subscript (B) is missing