关于 PHP 实现异步操作的研究
1.为啥 PHP
需要异步操作?
一般来说 PHP 适用的场合是 web 页面展示等耗时比较短的任务,如果对于比较花时
间的操作如 resize 图片、大数据导入、批量发送 EDM、SMS 等,就很容易出现操作超时情
况。你可以说我可以设置无限超时时间,等等你也要知道 PHP 有一个工作模式是
fastcgi,PHP
无限不超时,不代表 fastcgi
……
相应不超时
如果你还想说要 fastcgi 相应永
……
不超时,我建议你应该跟你们的运维人员讨论去
这个时候异步的操作就发挥他的作用了,由于是非阻塞操作,操作会即时返回,然
后在后台再慢慢干活。管你超时不超时的,我就没有在当前的进程/线程下干活。看吧是不
……
是很美好,不过其实这也是个坑
2.PHP 可以实现异步操作吗?
答案是肯定的,不过网上各种的纯 PHP 实现得就有点别扭了。socket 模式、挂起进程
模式、有的还直接 fork 进程。很好,各路神仙各显神通。如果运维人员看到的话,一定会××
×××你们的,不把 web server
……
跑死才怪
那还有其他更好的方法去实现这个异步操作的可能么?有,现在我们只有想怎么开
外挂了。查一下 PECL 主流的外挂方案有一堆的××MQ(消息队列),其中有个用于任务
分配的外挂进入了我们的视线 Gearman(其实这家伙才是角,我就不详细介绍了,点连接
看介绍)。
3.为啥选择 Gearman?
别的不说,就说他的 client 多,支持很多语言的 client,你可以使用大部分你喜欢的
语言去写 worker。我个人是很烦语言之争,你喜欢用神码语言写 worker 都随你喜欢。有数
据持久化支持(就是把队列保存到数据库介质中,那故障恢复也好做),有群集支持
(其实很多××MQ
都有这些功能)。 PECL 上有扩展,也有纯 PHP 实现扩展。反正这个
Gearman 也活了很久了,杂七杂八的问题都基本上解决了。
4.基本思路
有了 Gearman 这外挂就简单多了。就是向 gearman 发送一个任务,把执行的任务发出
去,然后等待 worker 去调用 PHP cli 去运行我们的 php 代码。
我就写了一下一个 python 的 worker(别问我为啥用 python,1.我会 python,2.linux 下
不用装 runtime),你可以自己根据思路写一个 PHP 的 worker,不过嘛,本人是不太信得
过 PHP 跑的 worker。其他语言饭可以用 java、node.js 或者其他语言实现一个 worker 试试。
对用 Golang 写 worker 有兴趣的朋友可以找我。
phpasync_worker_py