Gra*_*ble 9 windows asynchronous cross-platform symfony symfony-process
对于耗时的任务(电子邮件发送,图像处理......你明白了),我想运行异步PHP任务.
在Linux上这很容易,但我正在寻找一种适用于Windows的方法.
我希望它变得简单,应该如此.没有火炮,没有SQL排队,没有一次又一次地安装东西 ......我只想运行一个该死的异步任务.
所以我尝试了Symfony Process Component.问题是,同步运行任务工作正常,但在异步运行时,它会沿主脚本退出.
有没有办法来解决这个问题?
composer require symfony/process
Run Code Online (Sandbox Code Playgroud)
的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());
Run Code Online (Sandbox Code Playgroud)
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());
Run Code Online (Sandbox Code Playgroud)
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));
}
Run Code Online (Sandbox Code Playgroud)
结果
script (A) : 02:36:10 491
script (B) : 02:36:10 511
subscript (A) : 02:36:10 581
// subscript (B) is missing
Run Code Online (Sandbox Code Playgroud)
小智 1
当异步过程完成时,主脚本必须等待。试试这个代码:
$process = new Process('php subscript.php');
$process->start();
do {
$process->checkTimeout();
} while ($process->isRunning() && (sleep(1) !== false));
if (!$process->isSuccessful()) {
throw new \Exception($process->getErrorOutput());
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5374 次 |
| 最近记录: |