IMAP IDLE许多PHP帐户

时间:2014-08-20 10:20:00

标签: php imap

我似乎无法找到一种方法来监控大量IMAP帐户的变化。当任何一个帐户中的某些内容发生变化时,我想将其account_id推送到队列中,以便免费工作人员可以连接并获取更改(最终使用获取的信息更新其他服务)。

我正在使用PHP来连接和获取每个帐户中的消息,我的PHP库支持IMAP IDLE,但是使用PHP我是否只能通过1个进程监控1个帐户?因此,我需要数百到数千个进程来监控所有帐户(这需要许多资源)。

目前大约有100个帐户,但最终可以增长到3-4个。

1 个答案:

答案 0 :(得分:0)

这取决于IMAP库的灵活性。基本上,它需要两件事:公开它使用的TCP连接(资源;文件句柄;文件描述符......),并有两个单独的函数来发送IDLE"和#34;等待回复" (而不仅仅是一个不透明的"发送IDLE和块"函数)。

在最低级别,当您有多个连接时,您可以使用select()poll() epoll 等功能一次等待所有连接上的活动,或 kqueue 。使用这些方法之一,您可以创建一个简单的事件循环:

  1. 要求IMAP库将IDLE命令发送到所有IMAP连接。

  2. 将所有TCP连接提供给select()并等待它返回。

  3. 最终select()将返回具有某些活动(已接收数据或丢失连接)的TCP连接列表。

  4. 对于每个TCP连接,请查找相应的IMAP连接,并要求IMAP库读取其中的所有响应。

  5. 处理回复。

  6. 重复。

  7. 不幸的是,PHP仅提供select()尽管 - stream_select()用于"流"和socket_select()用于"套接字"。对于几十个连接来说,这应该足够了,但坦率地说,我不会期望它 - 或者说根本就是PHP - 能够与数百或数千个连接。实际上,我依稀记得大多数操作系统在select()中的限制为64左右,但是我必须稍后更新...