【问题标题】:Multi threaded socket based server - possible in php?基于多线程套接字的服务器 - 可能在 php 中?
【发布时间】:2011-10-07 19:30:55
【问题描述】:

我们有一堆用 php 编码的 cli cron 样式脚本。

其中一些服务使用 ftp 将数据发送到远程位置。

事情的设置方式,经常发生的事情是:

a) Script start
b) Connect to ftp @ remote location
c) Send data
d) Close ftp connection
e) Terminate script
f) Return to A, repeat, within a short amount of time and send to the same target, but different data.

问题是由于步骤 b 有相当多的开销(阅读:减速),它首先必须连接到 ftp 服务器,登录,确保文件夹存在,如果不创建它等等...我知道我知道,做事的正确方法是将这些转移合并为单一推动...但它远比那复杂。我从这里简化了大约 30-40 步。

所以我希望做的是建立一个这样的系统:

[ CRON CLI SCRIPT ] --->

[ LOCALLY HOSTED SOCKET BASED SERVER THAT KEEPS THE FTP CONNECTIONS OPEN ] --->

[ REMOTE FTP ]

通过以上,我们可以保持本地托管的基于套接字的服务器运行,并且 ftp 连接打开,我们将跳过过程中最长的部分,即 ftp 身份验证相关项目。

虽然在 PHP 中为“一次一个”风格的系统设置这个是相当简单的,但我以前从未做过的就是让它尽可能接近多线程。

在哪里打开套接字(例如,127.0.0.1:10000),并且可以进入多个请求。如果需要,产生“孩子”,建立新的 ftp 连接等。

任何人都可以深入了解如何在 php 中制作这个多线程,或者,如果有其他更好的解决方案吗? Perl 是一种选择。自从我接触到它已经有好几年了(YEARS...),但我相信在一些优秀的文档前几天会让我加快速度以实现它。

【问题讨论】:

标签: php multithreading sockets


【解决方案1】:

我们已经构建了一个系统,可以或多或少地满足您的需求。所以,用 PHP 构建一个多进程应用程序绝对是可能的。

然而,这不是微不足道的。如果您fork 关闭子进程,则需要非常小心地管理远程连接以避免出现问题。 (使用socket_* 系列函数代替fsockopen 以获得更好的控制)

此外,信号往往会中断您的正常程序流程。这当然是正常的,但 PHP 的构建并没有考虑到这一点 -> 为一些意想不到的结果做好准备。

【讨论】:

  • 您能否通过提供更多详细信息来扩展您的答案。
【解决方案2】:

尝试使用gearman,你可以用gearman处理最昂贵的cpu使用,gearman为每个进程创建一个新线程。

【讨论】:

    猜你喜欢
    • 2015-10-06
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多