【问题标题】:I need a script/application to persist TCP connections for a PHP frontend我需要一个脚本/应用程序来为 PHP 前端保持 TCP 连接
【发布时间】:2011-04-13 08:35:05
【问题描述】:

我正在使用基于 TCP 的自定义协议为后端服务器制作 PHP 前端。由于在建立与后端服务器的连接时握手相当复杂,我想保持与后端服务器的 TCP 连接。当然,鉴于 HTTP 固有的无状态特性(尤其是在 Apache 下使用 mod_php 时),我无法直接在 PHP 中执行此操作。

我正在考虑拥有一个本地“代理服务器”,以维护与后端服务器的连接池。 PHP 前端的每个用户都必须维护自己与后端服务器的连接,这一点很重要。现在,这不是一个非常复杂的程序,但是由于网络编程的许多陷阱,我宁愿使用一个健壮的、成熟的应用程序来做这样的事情。

我正在考虑连接到代理服务器的 PHP 应用程序,声明“我有一个 ID;123”,从那时起,所有进出服务器的内容都直接在 PHP 前端和后端服务器。

对此有什么优雅的解决方案建议吗?

谢谢!

【问题讨论】:

  • 你有没有想过 CURL(客户端 URL 库):php.net/manual/en/book.curl.php
  • 托德,感谢您的回复。不幸的是,cURL 是无关紧要的,因为它仍然在 PHP 中运行(换句话说,连接不能持久),而且它缺乏对晦涩的后端协议(不是 HTTP)的支持。

标签: php sockets proxy networking tcp


【解决方案1】:

建立和维护低级 TCP 连接和通信所需的一切:

http://php.net/manual/en/book.sockets.php

对于持久连接:

http://www.php.net/manual/en/function.pfsockopen.php

【讨论】:

  • 感谢您的回答。套接字功能我很清楚,但是 pfsockopen 的持久连接功能不足。这些连接是不可互换的——它们已经通过了服务器的身份验证,因此每个后端连接都需要与正确的前端用户匹配。此外,虽然我没有声称我已经对这个主题进行了大量研究,但我已经阅读了有关某些 Apache MPM 与持久连接相结合的坏事(不如“不工作”那么糟糕)。只是似乎不值得追求这个方向。有没有cmets?
【解决方案2】:

这是一个想法,虽然它可能无法很好地扩展:

基本思想是,您希望以某种方式代理这些原始套接字连接,以保持与后端系统的连接。

假设您有一个程序创建到后端系统的远程连接,然后在前端服务器的某个特殊目录中创建域套接字(fifo),并命名该域套接字在用户的 session_id 之后。这个过程只是代理两个连接之间的通信。

我不确定我将如何设计这样的代理。您可能可以在 PHP 中编写一个可以处理它的守护程序(提示:您可能想查看一些用于 php 守护程序的框架,例如 nanoserv 或 System_Deamon)——效率可能不是很高——但可能工作得很好。如果您有大量的连接,您可能希望使用带有线程的东西来避免对每个连接进行 fork()。

但基本思想是,对于与后端系统的每个打开连接,都有一些进程会公开一个本地域套接字,您的前端 PHP 脚本可以与之通信。那些前端、网络绑定的进程知道哪个套接字,因为它是以当前 session_id 命名的。

设置/拆除这些连接的方式和时间可能在很大程度上取决于您的情况。您需要某种方式让 Web 绑定进程请求套接字(此时代理守护进程会进行设置/握手,打开本地域套接字并开始代理),以及关闭它们的一些策略。

【讨论】:

  • 谢谢,我会去找一个运行 PHP 的守护进程。效率不是很重要;系统的用户并不多,守护进程基本上会像缓存一样发挥作用——如果守护进程启动,那太好了,我们可以节省一些时间。如果它关闭,前端将直接连接到服务器而不是(当然以性能为代价)。
猜你喜欢
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
  • 2018-04-10
  • 1970-01-01
  • 2020-11-21
  • 1970-01-01
相关资源
最近更新 更多