连接到localhost时,php imap_open()运行缓慢

时间:2013-12-15 05:19:20

标签: php

系统信息:运行在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命令......

任何想法我怎么能让它跑得更快?

1 个答案:

答案 0 :(得分:7)

以下两个步骤可帮助您入门。您想要隔离原因 - 是PHP还是本地IMAP服务器。这些步骤使用telnetstrace。您可能需要先安装它们:

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毫秒。

[3] https://bugs.php.net/bug.php?id=33500