套接字连接只需要一个线程吗?

时间:2012-03-16 02:21:54

标签: php sockets asyncsocket

据我所知,Apache不适合提供长轮询请求,因为每次进入Apache的请求都会使用一个工作线程,直到请求完成,这对于长轮询/ COMET请求可能需要很长时间。

但是套接字连接呢?在PHP网站上,我看到了{em>“用PHP编写的真正有效的简单多客户端服务器的an example

我的问题:这样的套接字服务器是否只对所有已建立的连接使用一个工作线程?反之亦然:是否有可能只使用一个工作线程编写一个同时连接到多个套接字服务器的PHP客户端?

3 个答案:

答案 0 :(得分:3)

看看phpDaemon。它设计用于长池应用程序和类似的。但我建议你尽可能使用node.js来完成这些任务。

答案 1 :(得分:3)

这是轮询循环样式服务器的示例 - 请参阅传递给MSG_DONTWAIT的{​​{1}}常量?从本质上讲,它有一个循环遍历所有打开套接字的线程,以查看它们中是否有任何数据等待。如果套接字没有数据等待,它将继续移动到下一个并检查它。

但是,请注意,使用这样的服务器,除了TCP基础之外,您不会获得良好的协议处理 - 您必须担心自己解析原始数据流。

答案 2 :(得分:3)

所有连接都是通过套接字完成的。主要区别在于I / O是否阻塞。选择从套接字接收阻塞将导致线程阻塞,但使用MSG_DONTWAIT将立即完成。

Apache在这方面为您提供了一些选择。您可以派生并发连接(mpm-prefork),为每个连接使用不同的线程(mpm-worker),或者使用非阻塞I / O(mpm-event)的线程。