PHP fsockopen Yavaş mı

1 Cevap php

Ben komutlar göndermek ve almak için fsockopen kullanarak PHP IMAP protokolü etrafında oynuyorum. Benim ön deneyler çalışır ama delicesine yavaş. Bu çalıştırmak için aşağıdaki basit bir işlev için yaklaşık 2 dakika sürer. Ben birkaç farklı IMAP sunucularını denedim ve aynı sonucu aldık. Bu kod çok yavaş neden kimse bana söyleyebilir misiniz?

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

?>

Bu geri almak yanıttır:

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

1 Cevap

Bu feof, uzak yan zamanlara kadar doğru dönmeyecek gibi görünüyor ve bağlantıyı kapatır. Eğer geçiyoruz $timeout parametre sadece ilk bağlantı girişimi için de geçerlidir.

Doğrudan durumunu yazdırmak için ise döngü değiştirmeyi deneyin:

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

Onun tam cevabını okuduktan sonra ya da kırmak için döngü çıkış durumu değiştirin. Muhtemelen protokolü hakkında daha akıllı olması gerekir.

Son olarak, ben neden PHP'nin built-in IMAP client kullanarak değil, sormak gerekir?