2009-08-23 64 views
0

我在使用fsockopen發送和接收命令在PHP中使用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); 

?> 

這是我回來了迴應:好像feof直到遠程端超時不會返回true,並關閉連接

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

。您傳遞的$timeout參數僅適用於初始連接嘗試。

試着改變你的while循環,直接打印狀態:

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

或更改你的循環退出條件的讀取完整的答覆後打破。它可能必須更聰明的協議。

最後,我不得不問,爲什麼你不使用PHP的built-in IMAP client

+0

我希望能夠在未安裝IMAP擴展程序的服務器上使用IMAP,例如共享主機環境。 – macinjosh 2009-08-23 20:15:53

+0

謝謝,看起來就是這樣! – macinjosh 2009-08-23 20:16:50

+1

這種解決方案已經存在。 phpclasses.org是完整的,你可以試試這個:http://www.phpclasses.org/browse/package/2351.html – Havenard 2009-08-23 20:18:38