2009-08-23 10 views
0

PHPでfsockopenを使ってコマンドを送受信するIMAPプロトコルで遊んでいます。私の予備実験はうまくいきますが、非常に遅いです。下記の簡単な機能を実行するには約2分かかります。私はいくつかの異なるIMAPサーバーを試して、同じ結果を得ました。誰がこのコードがなぜとても遅いのか教えていただけますか?PHP fsockopenが遅い

<?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

feofが出てリモート側の時間まで、trueを返し、接続を閉じないであろうように思え。渡すパラメータは、最初の接続試行にのみ適用されます。$timeout

は直接ステータスを印刷するには、あなたのwhileループを変更してみてください:

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

またはそのは、完全な回答を読んだ後破るためにあなたのループの終了条件を変更してください。おそらく、プロトコルについてはよりスマートにする必要があります。

最後に、PHPのbuilt-in IMAP clientを使用していないのはなぜですか?

+0

IMAP拡張機能がインストールされていないサーバーでIMAPを使用できるようにしたいと考えています。共有ホスティング環境。 – macinjosh

+0

ありがとうございました、それはそうでした! – macinjosh

+1

このような解決策は既に存在します。 phpclasses.orgはそれらでいっぱいです、あなたはこれを試すことができます:http://www.phpclasses.org/browse/package/2351.html – Havenard