【问题标题】:PHP imap_open() too slow? Any alternatives?PHP imap_open() 太慢了?有什么选择吗?
【发布时间】:2014-04-17 21:42:59
【问题描述】:

我的 IMAP 邮件连接有问题吗?因为这至少需要 40 秒:

<?php
    $mbox = imap_open('{myhost.example.com:993/imap/ssl}INBOX', "mymail@example.com", "password");

    imap_close($mbox);
?>

它可以工作,但它太慢了。正如你所看到的 - 一个基本的打开和关闭。好的,40 秒可能是可以接受的,但这中间没有任何操作!我尝试连接到 gmail IMAP 和我的个人主机 IMAP 服务器,结果相似。

现在我尝试了这个:

<?php
    $mbox = imap_open('{myhost.example.com:993/imap/ssl}INBOX', "mymail@example.com", "password");

    $unreadMails = imap_search($mbox, 'UNSEEN');

    imap_close($mbox);
?>

通过连接到一个新创建的邮箱,该邮箱只有 3 封电子邮件(1 封未读),当我从我的 PC 上执行它时,这需要大约 80 秒。然后我将此 PHP 脚本上传到我的服务器并尝试在那里执行它,但速度更慢 - 它甚至无法执行,它超时了。

我是不是做错了什么?

【问题讨论】:

  • 不应该。与 gmail 的连接通常需要不到 2 秒的时间。也许您的主机需要很长时间才能进行身份验证?
  • 我快疯了,所以我只有一台 VPS 主机来测试这个。它在那里完美地工作 - 在 1-2 秒内我建立了连接并设法检索了大约 50 封邮件。但是完全相同的代码在我的本地主机上最多需要 60 秒,而且在我的另一个共享主机上它会超时。我正在开发一个可以在许多不同情况下运行的商业脚本,所以对我来说重要的是它在任何地方都能正常工作。你可能正在做某事。我能以某种方式看到我的主机需要多长时间来进行身份验证吗?有什么方法可以加快这个过程吗?如果问题太模糊,请见谅。
  • 这方面有进展吗?我被困在同一个问题上。我发现它可能是DNS问题,但即使通过IP打开也无法解决问题。
  • @IanDess,遇到了类似的问题,但提供的链接似乎已损坏。想解释一下您对此问题的解决方案是什么?谢谢

标签: php email networking imap


【解决方案1】:

通过 openssl 连接到您的邮件服务器,检查启用了哪些身份验证方法:

openssl s_client -connect myhost.example.com:993

查找“AUTH=...”条目,示例:

* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN AUTH=LOGIN AUTH=CRAM-MD5] Dovecot ready.

找出您实际使用的身份验证方法,并在 imap_connect 中使用 DISABLE_AUTHENTICATOR 禁用另一种身份验证方法。在我的情况下,CRAM-MD5 花了很多时间,在另一种情况下

$mbox = imap_open('{myhost.example.com:993/imap/ssl}INBOX', "mymail@example.com", "password", NULL, 0, array('DISABLE_AUTHENTICATOR' => 'CRAM-MD5') );

或者:例如,禁用 dovecot 中不需要的身份验证方法。如果您这样做,请确保它不再被任何人使用,否则他们将在访问其邮箱时遇到问题。

此解决方案基于此与 GSSAPI 身份验证相关的帖子: http://php.net/manual/en/function.imap-open.php#104701

正如 Stackoverflow 的几个答案所指出的,另一种解决方案是在 imap_open 语句中使用 IP 地址和端口号,而不是域名。在某些情况下,不这样做显然会增加解析 DNS 条目和找到正确端口的延迟。

【讨论】:

  • 你打算如何使用 IP 和 SSL?
【解决方案2】:

我也遇到了同样的问题。将域名更改为 IP 地址或禁用 SSL 没有帮助。 imap_open 花了大约 30 秒,邮箱列表工作,但下载邮件导致异常。

原来我已经超过了GMail的带宽限制,因为我已经下载了整个5GB的邮箱:https://support.google.com/a/answer/1071518 所以我想我得等一个月才能再次通过 PHP 访问它。

【讨论】:

  • 哎哟。绝对分块您的请求。例如:$offset = 1; $limit = 10; for($id = $offset; $id &lt; $limit; $id++){ $emails[] = imap_fetchbody($mbox, $id); }
【解决方案3】:

这是一个旧版本,但我发现使用 imap4rev1 可以显着加快您与 Gmail 的连接时间。

【讨论】:

  • 请举个例子。
  • 这里没有足够的实质内容可以称为“好”的答案。赞成/反对票表明答案的质量。完全不正确的被删除。 “答案可以是‘不要那样做’,......但请尝试在你的答案中提及任何限制、假设或简化。简洁是可以接受的,但更全面的解释会更好。”所以是的,技术上是准确的,我不会投票反对,但我确实看到其他人投票反对,所以你可能想要改进它。如果你这样做,@我,我会投票赞成。见how to answer
猜你喜欢
  • 2013-12-19
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 2021-10-31
  • 2023-04-07
  • 1970-01-01
相关资源
最近更新 更多