2012-05-04 14 views
7

Aquí está el código que estoy usando:La lectura de datos desde fsockopen utilizando fgets/fread cuelga

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

me sale la primera respuesta:

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

pero entonces los tiempos página cabo. He buscado a través de stream_set_blocking, stream_set_timeout, stream_select, fread, etc. pero no pude hacerlo funcionar. Necesito leer todos los datos que envía el servidor y luego proceder con otros comandos (estaría recuperando correos electrónicos usando imap).

Gracias

+0

¿está seguro de la respuesta es sólo 256 ¿Caracteres largos? ¿Y estás seguro de que el socket es grabable? Es posible que su script se cuelgue en 'fwrite()' porque el socket no se puede escribir ... – shadyyx

+0

Sí. Probé eso al reemplazar el ciclo while escribiendo simples fgets ($ fp, 256) dos veces. Y esta es la respuesta que recibo: * CAPACIDAD IMAP4rev1 DESACELERAR IDLE NAMESPACE CUOTA ID XLIST NIÑOS X-GM-EXT-1 XYZZY SASL-IR AUTH = XOAUTH C01 OK –

Respuesta

8

Su secuencia de comandos está colgando en el bucle while al final. Esto se debe a que ha utilizado !feof() como condición para el bucle y el servidor no está cerrando la conexión. Esto significa que feof() siempre devolverá false y el ciclo continuará para siempre.

Esto no será un problema cuando su escritura una implementación completa, ya que se le busca códigos de respuesta y puede salir del bucle en consecuencia, por ejemplo:

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

Gracias. Ahora solo necesito descubrir los códigos de respuesta para otros comandos ... –

+1

[RFCs son tus amigos] (http://tools.ietf.org/html/rfc3501) ;-) (No olvides manejar las respuestas de error) también, o su script se colgará para siempre esperando la respuesta 'C01' que nunca obtendrá) – DaveRandom

+0

Sí. He estado revisando esos comandos desde hace un tiempo. Gracias de nuevo. –

1

Su script debe estar funcionando. De hecho, está funcionando.

Ver los resultados de abajo en mi pc cuando me encontré con su código:

* 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 

Desde Gmail no le desconecte. No hay un final de archivo. Y la carga de la página simplemente agota el tiempo de espera.

En otras palabras: su script simplemente seguirá esperando y esperando hasta que gmail se desconecte, lo que lamentablemente ocurre después de que la carga de su página ya ha expirado.

+0

¿Obtuviste el resultado inmediatamente o tardó un poco (1-2min) al tiempo de espera? –

+0

Probablemente el problema es que estás tratando de ejecutarlo desde una página web, ¿verdad? La página agota el tiempo de espera antes de que gmail se desconecte (por lo que feof() nunca devuelve verdadero). Probablemente pierda parte del buffer en el proceso de tiempo de espera. – Woutifier

+0

Sí. Tengo una página .php que tiene este código. ¿Cuál es el problema? –

Cuestiones relacionadas