PHP中的asynchronous函数调用
我正在开发一个PHP Web应用程序,我需要在请求中执行一些networking操作,例如根据用户请求从远程服务器获取某人。
是否有可能模拟PHP中的asynchronous行为,因为我必须传递一些数据到一个函数,也需要输出。
我的代码是这样的:
<?php $data1 = processGETandPOST(); $data2 = processGETandPOST(); $data3 = processGETandPOST(); $response1 = makeNetworkCall($data1); $response2 = makeNetworkCall($data2); $response3 = makeNetworkCall($data3); processNetworkResponse($response1); processNetworkResponse($response2); processNetworkResponse($response3); /*HTML and OTHER UI STUFF HERE*/ exit; ?>
每个networking操作需要大约5秒钟,以完成总共15秒加我的应用程序的响应时间,因为我提出了3个请求。
makeNetworkCall()函数只是做一个HTTP POST请求。
远程服务器是第三方API,所以我没有任何控制。
PS:请不要回答关于AJAX或其他事情的build议。 我目前正在寻找,如果我可以通过PHP做到这一点可能是一个C + +扩展或类似的东西。
我相信答案在这里:
PHP线程调用asynchronousphp函数
快速注意:使用线程
cURL将成为你唯一真正的select(无论是,或使用非阻塞套接字和一些自定义逻辑)。
这个链接应该给你正确的方向。 在PHP中没有asynchronous处理,但是如果您尝试同时发出多个Web请求,cURL Multi将为您处理这个问题。
我没有直接的答案,但你可能想看看这些东西:
- 反冲工程 – https://github.com/recoilphp/recoil
- php的LibEvent扩展? http://www.php.net/manual/en/book.libevent.php
- 过程分叉http://www.php.net/manual/en/function.pcntl-fork.php
- 消息代理,也就是说,你可以启动工作人员进行HTTP调用,一旦完成这个
job
,插入一个新的工作来描述需要完成的工作,以便处理caching的HTTP响应主体。
我认为,如果HTML和其他用户界面的东西需要返回的数据,那么不会有一种方法来asynchronous它。
我相信在PHP中执行此操作的唯一方法是在数据库中logging请求,并且每分钟执行一次cron检查,或者使用像Gearman队列处理之类的东西,或者使用exec()命令行进程
在此期间,您的PHP页面将不得不生成一些html或js,使它每隔几秒重新加载检查进度,不理想。
为了避开这个问题,你需要多less个不同的请求? 你可以每小时自动下载一次,并保存到数据库?
现在,最好是使用队列而不是线程(对于那些不使用Laravel的人来说,这里有大量其他的实现)。
基本的想法是,您的原始PHP脚本将任务或作业放入队列中。 然后你有在其他地方运行的队列工作者,把工作从队列中取出,并开始独立于原始的PHP处理它们。
优点是:
- 可伸缩性 – 您可以添加工作节点以跟上需求。 这样,任务并行运行。
- 可靠性 – 像RabbitMQ,ZeroMQ,Redis等现代化的队列pipe理器是非常可靠的。
还有http v2是curl的包装。 可以通过pecl来安装。