2012-03-16 42 views
2

据我所知,Apache不适合服务于长轮询请求,因为每个到Apache的请求都将使用一个工作线程,直到请求完成,这可能需要长时间轮询/ COMET请求。套接字连接只需要一个线程吗?

但是套接字连接呢。在PHP网站上,我看到an example的一个“用PHP编写的简单的多客户端服务器,真正起作用”

我的问题:这样的套接字服务器是否只为所有建立的连接使用一个工作线程?而相反的情况:是否可以编写一个只使用一个工作线程同时连接到多个套接字服务器的PHP客户端?

回答

3

看看phpDaemon。它为长池应用和类似设计。但是如果可能的话,我建议你使用node.js来完成这些任务。

+2

这个库的许可证是什么?我只看到它支持SOCKS,它可以处理套接字连接吗? – HomeCoder 2012-03-16 13:03:31

+1

在phpDaemon基于简单套接字连接的所有协议。您可以直接使用它或扩展。请参阅此示例https://github.com/kakserpom/phpdaemon/tree/master/app-servers项目不包含有关许可证的信息。尝试联系[作者](https://github.com/kakserpom)。 – 2012-03-16 14:47:34

3

这是一个轮询循环式服务器的示例 - 请参阅MSG_DONTWAIT常量被传递给socket_recv()?从本质上讲,它有一个单一的线程,通过它的所有打开的套接字循环来查看它们中的任何一个是否有数据等待。如果一个套接字没有数据等待,它将转到下一个并检查它。

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

+2

你对“协议处理”有什么意思,你能用一两句话来解释它吗(对于一个新手)? – HomeCoder 2012-03-16 12:57:43

+0

使用普通的网络服务器,您可以自动获取诸如解析HTTP标头等内容。使用套接字,您所获得的只是一个原始的字节流。这取决于这些字节的含义。 – Amber 2012-03-16 17:23:48

3

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

Apache给你在这方面的几个选项。您可以为并发连接(mpm-prefork)分叉,为每个连接(mpm-worker)或具有非阻塞I/O(mpm-event)的线程使用不同的线程。

相关问题