系统信息:运行在CentOS 6.2版(最终版),PHP 5.3.3,Dovecot + postfix设置,Apache / 2.2.15(Unix)
连接线:
$mbox = imap_open({'{localhost:143/imap/novalidate-cert}INBOX','un','pw');
更改端口和/或使用ip和域名没有影响...
一直需要5.5到7秒才能运行imap_open命令......
任何想法我怎么能让它跑得更快?
答案 0 :(得分:7)
以下两个步骤可帮助您入门。您想要隔离原因 - 是PHP还是本地IMAP服务器。这些步骤使用telnet
和strace
。您可能需要先安装它们:
yum install telnet
yum install strace
首先: Test the connection locally using telnet
$ telnet localhost 143
...
a LOGIN username password
还有延迟吗?如果是这样 - 何时:在初始连接时或在LOGIN
命令之后?如果有延迟,则问题与服务器上的IMAP有关,而与PHP无关。
第二:如果通过telnet快速连接,请创建一个最小的PHP脚本并使用strace
进行调试
<?php
// save this as imap_test.php
$mbox = imap_open({'{localhost:143/imap/novalidate-cert}INBOX','un','pw');
?>
$ strace -t -s 200 php ./imap_test.php
将strace的输出保存到文件strace.log
:
$ strace -t -s 200 php ./imap_test.php 2>&1 > strace.log
strace writes all its output to stderr.
2>&1 means to combine stderr with stdout, then > to write to the logfile.
If you want to see the output AND write it to a file, use tee:
$ strace -t -s 200 php ./imap_test.php 2>&1 | tee strace.log
您将获得大量输出。试着看看它是否挂起,等待什么。当你看到它挂起时快速按几次ENTER通常很有用 - 这样在命令完成后通过在输出中向后滚动来更容易定位。
有了一点耐心(和运气),你应该能够发现PHP在等待的地方,以及什么。
修改(或接下来发生的事情)
一个问题是SSL / TLS导致延迟。添加/notls
选项解决了它:
// This should be ok for internal connections to localhost, but you really
// dont want to disable TLS on an open network
$mbox = imap_open('{localhost:143/imap/notls}INBOX','un','pw');
禁用TLS会导致PHP警告。 Here is a discussion about handling them.
一个进一步的问题是身份验证方法。基本上php的imap_open会尝试所有协议。人们抱怨多年,最后通过在php 5.3中添加一个新参数来修复:[3]
$mbox = imap_open('{localhost:143/imap/notls}INBOX','un','pw',NULL,1,array('DISABLE_AUTHENTICATOR' => array('GSSAPI','NTLM)));
长话短说:从6秒到6毫秒。