基于多线程套接字的服务器 - 可能在PHP中?

时间:2011-10-07 19:30:56

标签: php multithreading sockets

我的术语可能就在这里,对我来说很光鲜:

我们有一堆用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 ......),但我确信在一些优秀的文档前几天会让我加快速度以实现它。

2 个答案:

答案 0 :(得分:3)

我们已经建立了一个或多或少做你想要的系统。因此,在PHP中构建多进程应用程序绝对是可能的。

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

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

答案 1 :(得分:0)

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