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 に答える