最近遇到个问题,PHP的异步回调怎么实现?
Workman、Swoole、fastcgi_finish_request?
Workman、Swoole这些框架虽然对异步回调实现的很好,但是如果只需要简单的异步回调就上这些未免大材小用。
而fastcgi_finish_request虽然使用方面,但毕竟只能在php-fpm模式下使用,而且一次请求只能使用一次。
之后就一直在思考:能不能自己实现一个PHP可用的简单异步回调呢?最初出现在我脑海的有几个方案:
编写PHP扩展,使用C/C++创建守护进程进程,用于监听是否有异步任务到来,如果有任务到来,则执行任务及回调函数。而PHP进程则将异步任务传递给该监听进程,从而实现异步。
使用pcntl扩展创建子进程,并让子进程脱离父进程的控制,成为守护进程。子进程用于处理耗时的异步任务,父进程处理HTTP请求及返回响应。
由于第二种方案更简单,因此选择使用第二种方案进行实现。
1. 实现原理及思路
实现原理比较简单:
在当前进程中创建子进程,父进程处理耗时较短的HTTP业务逻辑;子进程处理耗时较长的任务,例如邮件发送等。
创建子进程后,让子进程脱离父进程的控制,成为守护进程。
父进程通过设置Callable或Closure函数,让子进程执行异步任务及回调函数。
每个异步任务都需要两个关键元素组成:异步任务本身、回调函数。所以设计了JobInterface接口,该接口要求实现两个方法:job、callback,分别对应异