一样平常来说PHP适用的场合是web页面展示等耗时比较短的任务,如果对付比较花韶光的操作如resize图片、大数据导入、批量发送EDM、SMS等,就很随意马虎涌现操作超时情形。你可以说我可以设置无限超时时间,等等你也要知道PHP有一个事情模式是fastcgi,PHP无限不超时,不代表 fastcgi相应不超时……如果你还想说要fastcgi相应永不超时,我建议你该当跟你们的运维职员谈论去……你会得到的回答将是fuck you!!!!!
这个时候异步的操作就发挥他的浸染了,由于是非壅塞操作,操作会即时返回,然后在后台再逐步干活。管你超时不超时的,我就没有在当前的进程/线程下干活。看吧是不是很美好,不过实在这也是个坑……
2.PHP可以实现异步操作吗?
答案是肯定的,不过网上各种的纯PHP实现得就有点别扭了。socket模式、挂起进程模式、有的还直接fork进程。很好,各路神仙各显神通。如果运维职员看到的话,一定会xxoo你们的,不把web server跑去世才怪……
那还有其他更好的方法去实现这个异步操作的可能么?有,现在我们只有想怎么开外挂了。查一下PECL主流的外挂方案有一堆的rabbitMQ(行列步队),个中有个用于任务分配的外挂进入了我们的视线Gearman(实在这家伙才是角,我就不详细先容了,gearman http://www.ttlsa.com/?s=gearman&searchsubmit=Search)。
3.为啥选择Gearman?
别的不说,就说他的client多,支持很多措辞的client,你可以利用大部分你喜好的措辞去写worker。我个人是很烦措辞之争,你喜好用神码措辞写worker都随你喜好。有数据持久化支持(便是把行列步队保存到数据库介质中,那故障规复也好做),有群集支持(实在很多rabbitMQ都有这些功能)。 PECL上有扩展,也有纯PHP实现扩展。反正这个Gearman也活了良久了,杂七杂八的问题都基本上办理了。
有了Gearman这外挂就大略多了。便是向gearman发送一个任务,把实行的任务发出去,然后等待worker去调用PHP cli去运行我们的php代码。
4.结论
经由以上配置犀牛一样大的家伙后(要装一个Gearman,还要跑个Py脚本),我们基本上就使PHP拥有了异步调用功能,当然个中还有一个状态掩护神马的要自己去实现。以是创造,实在这个方案不咋样,太繁芜了。还是利用一些web service的办法去做web callback会好点(问题是web callback一样会超时……)。