2012-05-04 15 views
7

Ecco il codice che sto usando:lettura dei dati da fsockopen utilizzando fgets/fread pende

if (!($fp = fsockopen('ssl://imap.gmail.com', '993', $errno, $errstr, 15))) 
    echo "Could not connect to host"; 
$server_response = fread($fp, 256); 
echo $server_response; 

fwrite($fp, "C01 CAPABILITY"."\r\n"); 
while (!feof($fp)) { 
    echo fgets($fp, 256); 
} 

ottengo la prima risposta:

OK Gimap ready for requests from xx.xx.xx.xx v3if9968808ibd.15 

ma poi i tempi di pagina fuori. Ho cercato attraverso stream_set_blocking, stream_set_timeout, stream_select, fread, ecc. Ma non sono riuscito a farlo funzionare. Ho bisogno di leggere tutti i dati che il server invia e quindi procedere con altri comandi (vorrei recuperare le email usando imap).

Grazie

+0

Sei sicuro che la risposta è soltanto 256 caratteri lunghi? E sei sicuro che la presa sia scrivibile? È possibile che il tuo script si blocchi su 'fwrite()' a causa del socket non è scrivibile ... – shadyyx

+0

Sì. L'ho provato sostituendo il ciclo while con una semplice scrittura di fgets ($ fp, 256) due volte. E questa è la risposta che ottengo: * CAPACITÀ IMAP4rev1 ID NON SELEZIONABILE NAMESPACE ID QUOTA XLIST CHILDREN X-GM-EXT-1 XYZZY SASL-IR AUTH = XOAUTH C01 OK –

risposta

8

Lo script è sospeso nel ciclo while alla fine. Questo perché hai utilizzato !feof() come condizione per il ciclo e il server non sta chiudendo la connessione. Ciò significa che feof() restituirà sempre false e il ciclo continuerà per sempre.

Questo non sarà un problema quando la scrittura di una piena attuazione, come si sarà alla ricerca di codici di risposta e può rompere fuori dal giro di conseguenza, ad esempio:

<?php 

    // Open a socket 
    if (!($fp = fsockopen('ssl://imap.gmail.com', 993, $errno, $errstr, 15))) { 
     die("Could not connect to host"); 
    } 

    // Set timout to 1 second 
    if (!stream_set_timeout($fp, 1)) die("Could not set timeout"); 

    // Fetch first line of response and echo it 
    echo fgets($fp); 

    // Send data to server 
    echo "Writing data..."; 
    fwrite($fp, "C01 CAPABILITY\r\n"); 
    echo " Done\r\n"; 

    // Keep fetching lines until response code is correct 
    while ($line = fgets($fp)) { 
    echo $line; 
    $line = preg_split('/\s+/', $line, 0, PREG_SPLIT_NO_EMPTY); 
    $code = $line[0]; 
    if (strtoupper($code) == 'C01') { 
     break; 
    } 
    } 

    echo "I've finished!"; 
+0

Grazie. Ora ho solo bisogno di capire i codici di risposta per altri comandi ... –

+1

[RFCs sono i tuoi amici] (http://tools.ietf.org/html/rfc3501) ;-) (Non dimenticare di gestire le risposte agli errori allo stesso modo, o lo script si bloccherà per sempre aspettando la risposta 'C01' che non otterrà mai) – DaveRandom

+0

Sì. Ho controllato quei comandi da un po 'di tempo. Grazie ancora. –

1

Lo script dovrebbe funzionare. In effetti, sta funzionando.

Vedi i risultati qui sotto sul mio pc quando mi sono imbattuto il tuo codice:

* OK Gimap ready for requests from xx.xx.xx.xx l5if4585958ebb.20 
* CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 XYZZY SASL-IR AUTH=XOAUTH 
C01 OK Thats all she wrote! l5if4585958ebb.20 

Dal momento che Gmail non ti disconnette. Non si verifica la fine del file. E il caricamento della pagina è semplicemente scaduto.

In altre parole: il tuo script continuerà ad aspettare e attendere fino alla disconnessione di gmail, cosa che sfortunatamente accade dopo che il caricamento della tua pagina è già scaduto.

+0

Hai ottenuto il risultato immediatamente, o ci è voluto del tempo (1-2 minuti) per timeout ?? –

+0

Il problema è probabilmente che stai provando ad eseguirlo da una pagina web, ho ragione? La pagina scade prima che gmail si disconnetta (quindi feof() non restituisce mai true). Probabilmente perde parte del buffer nel processo di timeout. – Woutifier

+0

Sì. Ho una pagina .php che ha questo codice. Qual è il problema? –

Problemi correlati