【问题标题】:Do socket connections only need one thread?套接字连接只需要一个线程吗?
【发布时间】:2012-04-01 15:01:43
【问题描述】:

据我了解,Apache 不适合处理长轮询请求,因为对 Apache 的每个请求都将使用一个工作线程,直到请求完成,这对于长轮询/COMET 请求可能需要很长时间。

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

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

【问题讨论】:

    标签: php sockets asyncsocket


    【解决方案1】:

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

    【讨论】:

    • 这个库的许可证是什么?我只看到支持SOCKS,能处理socket连接吗?
    • 在 phpDaemon 中所有协议都基于简单的套接字连接。您可以直接使用它或扩展它。请参阅此示例github.com/kakserpom/phpdaemon/tree/master/app-servers 项目不包含有关许可证的信息。尝试联系author
    【解决方案2】:

    这是一个轮询循环式服务器的示例 - 看到 MSG_DONTWAIT 常量被传递给 socket_recv() 了吗?本质上,它有一个线程循环遍历所有打开的套接字,以查看其中是否有数据等待。如果一个套接字没有等待数据,它会移动到下一个并检查它。

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

    【讨论】:

    • “协议处理”是什么意思,你能用一两句话解释一下吗(对于新手)?
    • 使用普通的网络服务器,您会自动获得解析 HTTP 标头等内容。使用套接字,您获得的只是原始字节流。这些字节的含义由您决定。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多