0

我在使用 fsockopen 来发送和接收命令的 PHP 中使用 IMAP 协议。我的初步实验有效,但速度非常慢。下面的简单函数运行大约需要 2 分钟。我尝试了几个不同的 IMAP 服务器并得到了相同的结果。谁能告诉我为什么这段代码这么慢?

<?php

function connectToServer($host, $port, $timeout) {
    // Connect to the server
    $conn = fsockopen($host, $port, $errno, $errstr, $timeout);

    // Write IMAP Command
    $command = "a001 CAPABILITY\r\n";

    // Send Command
    fputs($conn, $command, strlen($command));

    // Read in responses
    while (!feof($conn)) {
        $data .= fgets($conn, 1024);
    }

    // Display Responses
    print $data;

    // Close connection to server
    fclose($conn);
}

connectToServer('mail.me.com', 143, 30);

?>

这是我得到的回复:

macinjosh:Desktop Josh$ php test.php
* OK [CAPABILITY mmp0613 IMAP4 IMAP4rev1 ACL QUOTA LITERAL+ NAMESPACE UIDPLUS CHILDREN BINARY UNSELECT SORT LANGUAGE IDLE XSENDER X-NETSCAPE XSERVERINFO X-SUN-SORT X-SUN-IMAP X-ANNOTATEMORE X-UNAUTHENTICATE XUM1 AUTH=PLAIN STARTTLS] Messaging Multiplexor (Sun Java(tm) System Messaging Server 6.3-6.03 (built Jun  5 2008))
* CAPABILITY mmp0613 IMAP4 IMAP4rev1 ACL QUOTA LITERAL+ NAMESPACE UIDPLUS CHILDREN BINARY UNSELECT SORT LANGUAGE IDLE XSENDER X-NETSCAPE XSERVERINFO X-SUN-SORT X-SUN-IMAP X-ANNOTATEMORE X-UNAUTHENTICATE XUM1 AUTH=PLAIN STARTTLS
a001 OK CAPABILITY completed
4

1 回答 1

3

在远程端超时并关闭连接之前,它似乎feof不会返回 true。您传递的$timeout参数仅适用于初始连接尝试。

尝试更改您的 while 循环以直接打印状态:

while (!feof($conn)) {
    print fgets($conn, 1024);
}

或者在阅读完整回复后将循环退出条件更改为中断。它可能必须对协议更聪明。

最后,我要问,你为什么不用 PHP内置的 IMAP 客户端

于 2009-08-23T20:13:35.987 回答