background image

关于 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