我不完全确定为什么是这样,但是如果你循环遍历邮箱中的所有邮件,每次都调用 imap_header(),你可以通过首先调用 imap_headers() 来显著提高性能。
比较一下这个
<?php
$imap = imap_open("{my.server.com:143}INBOX", "user", "pass");
$n_msgs = imap_num_msg($imap);
$s = microtime(true);
for ($i=0; $i<$n_msgs; $i++) {
$header = imap_header($imap, $i);
}
$e = microtime(true);
echo ($e - $s);
imap_close($imap);
?>
使用这段代码
<?php
$imap = imap_open("{my.server.com:143}INBOX", "user", "pass");
$n_msgs = imap_num_msg($imap);
imap_headers($imap)
$s = microtime(true);
for ($i=0; $i<$n_msgs; $i++) {
$header = imap_header($imap, $i);
}
$e = microtime(true);
echo ($e - $s);
imap_close($imap);
?>
根据我在多台机器上连接多个不同服务器进行的测试,性能差异在于第二段代码始终只花费一半甚至更少的时间。
这可能是因为 `imap_headers()` 通过一次连接检索所有邮件,而 `imap_header()` 必须为每封邮件发出新的获取请求?我不确定为什么先调用 `imap_headers()` 会更快,但我确实知道它更快,所以我认为可以分享一下这个知识。如果有人知道原因,请告诉我……