【问题标题】:IMAP IDLE many accounts in PHPIMAP IDLE PHP 中的许多帐户
【发布时间】:2014-08-20 21:10:33
【问题描述】:

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

我正在使用 PHP 连接并获取每个帐户中的消息,我的 PHP 库支持 IMAP IDLE,但是使用 PHP 我只能通过 1 个进程监控 1 个帐户,这是真的吗?所以我需要成百上千个进程来监控所有帐户(这需要大量资源)。

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

【问题讨论】:

    标签: php imap


    【解决方案1】:

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

    在最低级别,当您有多个连接时,您可以使用select()poll()epoll 等函数同时等待所有连接上的活动队列。使用其中一种方法,您可以创建一个简单的事件循环:

    1. 请求 IMAP 库向所有 IMAP 连接发送IDLE 命令。

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

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

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

    5. 处理响应。

    6. 重复。

    不幸的是,PHP 仅提供 select() - stream_select() 用于“流”,socket_select() 用于“套接字”。对于几十个连接来说,这应该足够了,但坦率地说,我不希望它——或者根本不希望 PHP——能够很好地与数百或数千个连接一起工作。事实上,我依稀记得大多数操作系统在 select() 中的 fd 限制为 64 个左右,但我以后必须更新这个......

    【讨论】:

    • 您对这个“通知”部分建议使用什么语言?当我只有一个“account_id”并且能够将它放入像 beanstalkd 这样的队列中时,我可以使用 PHP 来完成繁重的工作(获取、解析等)。
    • @Floris:我不太确定,但是对于一百多个连接,我会选择一种允许使用 Linux “epoll” 或 BSD “kqueue” 的语言(并且具有良好的当然 IMAP 库也是如此)...从更高级别的库中,Ruby 或 Python 或 JS(通过 Node.js)可能会工作。
    • 我只发现 inboxapp 做了类似的事情,但它们似乎并不是真正为规模而构建的。有其他选择吗?
    猜你喜欢
    • 2013-07-14
    • 1970-01-01
    • 2011-01-21
    • 2011-05-21
    • 2011-03-27
    • 2010-11-22
    • 2012-07-06
    • 1970-01-01
    • 2010-11-07
    相关资源
    最近更新 更多