PHP异步回调的简单实现
php-fpm模式的使用,仍在测试,可能会出现未知问题。
- php-fpm模式下已解决的问题:
解决异步进程执行完成后,成为僵尸进程的问题
经测试,异步进程的fork不受php-fpm配置的进程数限制
- ext-pcntl
- php > 5.6
composer require alanalbert/php-async
该库可以工作在php-fpm或cli模式下。(但是,每个异步任务会创建一个进程进行处理,直至任务完成后才会被彻底杀死)
现在可以使用PHP Async Manager命令行工具进行异步任务管理。
require './vendor/autoload.php';
use Async\DaemonProcess;
use Async\Job;
// 异步操作任务
$job = new Job();
// 设置异步任务
$job->setJob(function () {
sleep(5);
});
// 设置回调函数
$job->setCallback(function () {
file_put_contents('处理完成.txt', '处理完成');
});
// 实例化异步进程
$daemon = new DaemonProcess($job);
$daemon->run();
守护进程类,该类提供的方法有:
// 构造函数,接收实现Async\Contract\JobInterface接口的类的实例
__construct(Async\Contract\JobInterface $job): void
// 运行守护进程
run(): void
异步任务接口,该接口很简单,只需要实现两个方法即可:
// 异步任务
job(): void
// 回调任务
callback(): void
该类实现了Async\Contract\JobInterface
接口,使用起来更方便,其提供的方法有:
// 设置异步任务
// $job可以为callable或Closure类型
// $params为异步任务需要使用的参数,会在执行时,传入给异步任务
setJob($job, $params = null): void
// 设置回调函数
// $callback可以为callable或Closure类型
// $params为回调函数需要使用的参数,会在执行时,传入给回调函数
setCallback($callback, $params = null): void
- 在使用该库执行异步任务时,会生成日志文件,位于
/tmp/php-async-log/
下 - 如果不使用
Async\Job
类,也可以自定义类并实现Async\Contract\JobInterface
接口
- ...