2010-05-17 67 views
4

我需要为我的应用程序编写一些服务。我希望每个客户端都有有限的持久连接(例如只允许前10个客户端连接)。如何使用PHP制作服务器应用程序

我知道我可以用PHP通过socket_listen()在端口上收听。父进程接受连接,然后pcntl_fork()进程让子进程处理连接。

但据我所知,在fork()ed时,PHP资源不会持久。我想知道是否有可能用PHP来做到这一点,或者我必须在C中做到这一点?

+0

据我所知,问题是存储所有分支所需数据的位置(例如连接数)? – Kirzilla 2010-05-17 09:52:09

回答

1

1) 为什么要分叉?将守护进程作为单个进程运行,并使用socket_select()(或stream_select)来侦听请求。

请参阅Aleksey Zapparov的代码here以获取现成的解决方案。

2) 为什么还要编写自己的套接字代码 - 使用[x] inetd来管理服务器并执行stdio上的通信(请注意,与解决方案1不同,每个套接字将有一个独立的进程客户端 - 因此处理代码将是非阻塞的)

- 您说的正确的地方是PHP资源不应该在分叉进程中可用 - 但不会指出这与您当前的问题之间的关系。只是为了让您可以统计连接数量?或者是其他东西?在前者的情况下,这样做有很多简单的方法。使用解决方案1时,只需在客户端连接/断开连接时递增和递减计数器变量。在2的情况下,采用相同的方法,但将变量保存在数据文件/数据库中(您可能还想存储有关连接的信息并运行偶尔的审计)。或者限制防火墙上的连接。

C.

+0

我的问题是我有一个Online Judge系统。我想分发在多台机器上运行的测试(以减少结果中的噪音,这可能会导致在边缘时间运行的解决方案)。 守护进程是一个队列管理器。它从数据库中读取是否有新的提交。因此,队列管理器守护程序必须始终连接每个客户端,以便为每个客户端分配解决方案,然后等待客户端的结果。但是我需要并发性来节省结果,所以我考虑使用守护进程和分叉进程。使用我自己的套接字代码,我也可以轻松地将它移植到Windows上。 – innocenat 2010-05-17 12:48:09

+0

你所描述的似乎是一个半同步的请求/回复消息发布系统 - 这是一个完全不同的水壶。当然,解决方案1仍然是可行的。我认为“Windows”是指微软的平台之一 - 在这种情况下,解决方案2是相当深奥的。但1仍然有效。但是从您的有限说明中,大部分连接分配都应通过数据进行控制。 – symcbean 2010-05-17 14:04:09

+0

通过数据控制连接分配?是的,我的意思是Microsoft Windows。但解决方案之一,我不知道是否socket_select阻塞,我需要广播消息... – innocenat 2010-05-18 04:15:06

0

也许你可以尝试使用memcache共享它(http://www.php.net/manual/en/book.memcache.php)。 (我从来没有尝试过,可能会有效)

+0

-1没有资源只在创建它们的过程中有效 - 理论上它们可以跨轻量级线程移植 - 但PHP不实现线程处理。 – symcbean 2010-05-17 11:21:10

+0

我的不好。即使使用shmop()? – 2010-05-17 13:30:05

相关问题