stream_socket_client()线程安全吗?

时间:2012-10-29 16:57:14

标签: php sockets thread-safety

在最近的PHP版本(> 5.3)中,我无法找到stream_socket_client()和关联的fsockopen()是否合理的线程安全。

我最感兴趣的是Apache上的PHP,Linux。而且,无论Apache MPM-prefork是否有所作为,如果知识存在,如果所有这些都适用于例如fastCGI。 Nginx的。

一个简短的测试,告诉我每个fork都会创建自己的套接字文件,但是对于更多的并发连接,这是否适用?这是由于Apache的分叉,Unix的套接字架构还是PHP本身的性质?当谈到这些接近金属问题时,我很无能为力。

或者:可以安全地假设当读取和写入stream_socket_client()的来源时,永远不会在不同的连接上发生冲突吗?

2 个答案:

答案 0 :(得分:2)

关于pthreads:

PHP的架构在这一点上是一成不变的 - 阅读PHP6 - 所以事实是,你现在或将来通过PECL扩展你能识别为PHP的任何东西的唯一方法,但你不应该让那些让你失望 - 你不会因为它不是核心的一部分而从你的网络中承担APC的能力。我可能有点偏颇,因为我是pthreads的唯一作者,但我没有使用巫毒或法术,我使用的是Objects API,结合TSRM和显然扩展API - 所有的东西多年来一直在制作并且有数十亿小时的实际测试,这并不是说pthreads已经准备就绪,当然不是,但有一天会有。

pthreads不太可能共享资源,我已经对此进行了长时间的实验,并且我找到了多种方法使其工作,但没有一种方法令人满意。 PHP主要是扩展(即使标准库是作为扩展实现的 - 它是添加功能的最有效方式),并且它们都没有为对象级多线程环境做好准备。由于这么多原因,PHP不适合多线程网络应用程序。当您以非线性方式思考时,为什么要共享资源(除了套接字 - 使用更合适的东西),可以在完全不同的线程中创建和操作资源,同时继续解析您的业务模板或json或您的应用程序所做的任何事情。考虑到这一点,我不觉得有必要将共享资源作为优先事项,甚至是pthreads的目标。

答案 1 :(得分:0)

PHP本身对线程的支持很少。它可能会也可能不会对“线程安全”的函数做出承诺,但是当解释器本身假装线程不存在时,这会产生很小的差别。 *

就mpm_prefork而言,无所谓。 Prefork MPM完全是关于分叉(因此得名)。它不会打扰线程,因此PHP的线程安全问题并没有真正出现。

我对FastCGI(特别是它与老式CGI的不同之处)了解不多,但除非它需要来自解释器的大量特殊支持,否则它还将使用多进程模型而不是多线程一。每个解释器都有自己的进程,这使得PHP对线程的支持几乎无关紧要。

*有一个PECL模块为PHP提供了一种使用pthread的方法,但它不是核心的一部分,我想有一大堆扩展在线程发挥作用时会破坏所有地狱。我认为PHP中的线程远远不够成熟以供生产使用,并且可能会继续这样,直到PHP本身提供了创建线程的方法。