如何使用相同的PHP运行实例处理多个请求?

时间:2017-09-08 12:40:51

标签: php performance high-load reactphp

众所周知,PHP在“无分享”的哲学中起作用。 因此,它受到严重的性能限制。

虽然某些缓存扩展可以加速编译脚本,但我们无法避免非常繁重的初始化(例如,我们有一个Web服务,每次调用至少需要解析和引导DTO模式,设置数据绑定,连接数据库(从那个角度来看,持久的mysql连接真的很脏),打开另一个远程服务等等。)

此问题似乎也可以通过ReactPHP框架解决,但是......是否存在任何轻量级的非框架解决方案?从黑客方式,单文件示例到轻量级库(不是框架)的任何东西都被接受了。 无需复杂的Web服务器重新创建的功能。只处理普通的POST请求就足够了。

<offtopic>

任务本身是如此重要,所以我想知道为什么PHP不提供这种开箱即用的...

</offtopic>

2 个答案:

答案 0 :(得分:1)

一个很好的方法是使用一个CLI脚本,它就像普通的Java / nodeJS服务器一样。并使用轻量级PHP网关接收HTTP请求,并通过套接字从CLI获取所需信息。

有趣的读物是http://liveforeverbook.info/blog/2008/01/31/persistent-web-apps-in-php/

  

关键是CLI脚本保留了消息存储   内存中(如Java服务),并与客户端通信   通过基于Web的PHP“网关”。

     

IRC服务器&lt; - &gt; PHP网关&lt; - &gt;客户端网关步骤不是   实际需要,但有助于过滤掉可能来的垃圾   如果IRC服务器直接连接到网络。

     

启动从控制台作为脚本运行的IRC服务器(php   server.php),让它继续运行。 CLI脚本没有超时,所以它   将继续运行,直到您手动将其关闭。

答案 1 :(得分:1)

  

是否存在任何轻量级的非框架解决方案?从黑客方式,单文件示例到轻量级库(不是框架)的任何东西都可以接受。

取决于您正在寻找的内容。您将需要某种事件循环/调度程序,这主要是amphp/amp / react/event-loop提供的。如果你不想在回调地狱中死去,你需要某种形式的承诺实施,由amphp/amp / react/promise提供。

如果您将这些部分视为框架并且不想使用这些部分,您当然可以自己编写。但是,您再次寻找稳定的软件,其中任何一个都比您自己的实施更稳定,因为它们的使用范围更广,报告和修复了错误。

除了这些基础之外的任何东西都只是库。您可以使用它们或编写自己的。如果您碰巧只需要一个套接字服务器,为什么不使用已经处理PHP边缘情况的库呢?

  

不需要复杂的Web服务器重新创建的功能。只处理普通的POST请求就足够了。

哦,什么是复杂的网络服务器? &#34;只是&#34;处理普通的POST请求?您需要一个HTTP协议解析器,它可以正确处理流水线请求,解码分块编码,如果您想处理上传文件,则需要多部分解析器等。

如果您只是想在单个PHP流程中处理多个请求而不重复引导,我建议您查看PHP-PM,但此时它并非如此准备就绪。