Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP接收并响应数千个请求-在幕后进行计算_Php_Parallel Processing_Redis_Queue_Message Queue - Fatal编程技术网

PHP接收并响应数千个请求-在幕后进行计算

PHP接收并响应数千个请求-在幕后进行计算,php,parallel-processing,redis,queue,message-queue,Php,Parallel Processing,Redis,Queue,Message Queue,我正在编写一个PHP脚本: 接收客户端请求; 通过CPU和时间密集型二进制计算处理请求 将计算结果存储到MySQL数据库中 然后以状态200 OK响应客户端 问题:当高峰时间每秒有10到1000个请求传入时:客户端必须等待很长时间才能接收状态200 OK 灵活性:脚本不需要向客户端响应计算结果。脚本甚至不需要根据计算的成功/失败来响应状态200OK——计算可能最终会失败,这是完全正确的。因此,实际的计算实际上可以在幕后并行进行 应该使用哪些工具/包/库/策略在PHP上实现这种密集的请求处理设计?

我正在编写一个PHP脚本:

接收客户端请求; 通过CPU和时间密集型二进制计算处理请求 将计算结果存储到MySQL数据库中 然后以状态200 OK响应客户端 问题:当高峰时间每秒有10到1000个请求传入时:客户端必须等待很长时间才能接收状态200 OK

灵活性:脚本不需要向客户端响应计算结果。脚本甚至不需要根据计算的成功/失败来响应状态200OK——计算可能最终会失败,这是完全正确的。因此,实际的计算实际上可以在幕后并行进行

应该使用哪些工具/包/库/策略在PHP上实现这种密集的请求处理设计?它甚至是PHP端的东西,还是可以从Apache端解决

注:

在Ubuntu[AMPRU]上运行Apache、MySQL、PHP和Redis 客户端只需发送一个请求并立即收到状态200 OK。 客户端不会等待请求的计算完成。 没有自动扩展或负载平衡的概念:它是一个单一的AMPRU服务器。 如果多个计算可以在幕后并行进行,效果会更好
这是队列的典型用例。在您列出的技术堆栈中,Redis支持队列检查库的PHP Resque,或者可以使用其他工具,例如我最喜欢的Beanstalk,Pheanstalk PHP库或Amazon SQS。还有许多其他选项,既可以自托管,也可以作为服务提供

网站或其他机制接收数据,并将其排队-返回200 OK。后端工作人员(与基于cron的系统一样简单),或者更好的方法是多次长时间运行,偶尔重新启动以清理脚本,从队列中提取项目并执行工作,保存结果


通过这样的系统,我已经做了数以亿计这样的工作。如果工作线程可以访问队列和数据库服务器,那么它们甚至不必在同一台机器上运行。我在这么多服务器上运行了几十个工作线程。

可能的重复我知道线程可以启动,然后必须在父上下文中重新连接?在这里,我试图将计算委托给接收请求的运行时。通过线程可以实现吗?我想是的。如果您在不同的线程中启动进程,您将能够直接返回结果200OK,而无需等待执行完成。唯一的问题是你是否需要在子线程中管理进程,也许这是一个更好的挖掘的地方-太好了。。。我的ab-n 1000-C10最初需要200多秒。我刚刚实现了redis队列,它将ab时间缩短到了3秒左右。超级兴奋。现在需要构建worker。仅供参考:我使用PHP resque实现了基于redis的排队系统。伟大的9集分步教程系列也可在