我似乎无法找到一种方法来监控大量IMAP帐户的变化。当任何一个帐户中的某些内容发生变化时,我想将其account_id推送到队列中,以便免费工作人员可以连接并获取更改(最终使用获取的信息更新其他服务)。
我正在使用PHP来连接和获取每个帐户中的消息,我的PHP库支持IMAP IDLE,但是使用PHP我是否只能通过1个进程监控1个帐户?因此,我需要数百到数千个进程来监控所有帐户(这需要许多资源)。
目前大约有100个帐户,但最终可以增长到3-4个。
答案 0 :(得分:0)
这取决于IMAP库的灵活性。基本上,它需要两件事:公开它使用的TCP连接(资源;文件句柄;文件描述符......),并有两个单独的函数来发送IDLE"和#34;等待回复" (而不仅仅是一个不透明的"发送IDLE和块"函数)。
在最低级别,当您有多个连接时,您可以使用select()
,poll()
, epoll 等功能一次等待所有连接上的活动,或 kqueue 。使用这些方法之一,您可以创建一个简单的事件循环:
要求IMAP库将IDLE
命令发送到所有IMAP连接。
将所有TCP连接提供给select()
并等待它返回。
最终select()
将返回具有某些活动(已接收数据或丢失连接)的TCP连接列表。
对于每个TCP连接,请查找相应的IMAP连接,并要求IMAP库读取其中的所有响应。
处理回复。
重复。
不幸的是,PHP仅提供select()尽管 - stream_select()用于"流"和socket_select()用于"套接字"。对于几十个连接来说,这应该足够了,但坦率地说,我不会期望它 - 或者说根本就是PHP - 能够与数百或数千个连接。实际上,我依稀记得大多数操作系统在select()
中的限制为64左右,但是我必须稍后更新...