2010-11-06 15 views
5

¿Es posible usar socket_create/socket_connect sobre SSL en modo no bloqueante?Conexión de socket sin bloqueo a través de SSL?

Actualmente estoy usando \fsockopen() que admite nativamente un prefijo 'ssl: //'. Sin embargo, fsockopen() se bloqueará hasta que se haya establecido la conexión. Esto es indeseable en un script que puede tener alrededor de 50 sockets simultáneos esperando a ser leídos.

He creado un script de prueba para usar \socket_create(), que se puede cambiar al modo sin bloqueo antes de llamar al \socket_connect(). Sin embargo, no parece tener ningún soporte para las conexiones SSL (a diferencia del contenedor fsockopen()).

Respuesta

3

La respuesta sería usar en su lugar stream_socket_client con la bandera STREAM_CLIENT_ASYNC_CONNECT; Sin embargo parece que hay algún error con SSL:

<?php 
$socket = stream_socket_client(
     'ssl://197.136.197.92:443', $errno, $errstr, 
     3, // timeout should be ignored when ASYNC 
     STREAM_CLIENT_ASYNC_CONNECT 
); 
if (!$socket) { 
    echo "errno = ".$errno."\nerrstr = ".$errstr."\n"; 
    exit; 
} 

En Linux parece que hay un bucle infinito con:

write(3, "\26\3\1\0o\1\0\0k\3\1L\325w/\337u\343uV\341\365}H\331\21k\313\341Q\f\356\""..., 116) = -1 EAGAIN (Resource temporarily unavailable) 

En alguna variante BSD en http://codepad.viper-7.com/:

<br /> 
<b>Warning</b>: stream_socket_client() [<a href='function.stream-socket-client'>function.stream-socket-client</a>]: SSL: connection timeout in <b>/tmp/cpQ8Gv7B</b> on line <b>9</b><br /> 
<br /> 
<b>Warning</b>: stream_socket_client() [<a href='function.stream-socket-client'>function.stream-socket-client</a>]: Failed to enable crypto in <b>/tmp/cpQ8Gv7B</b> on line <b>9</b><br /> 
<br /> 
<b>Warning</b>: stream_socket_client() [<a href='function.stream-socket-client'>function.stream-socket-client</a>]: unable to connect to ssl://197.136.197.92:443 (Unknown error) in <b>/tmp/cpQ8Gv7B</b> on line <b>9</b><br /> 
errno = 115 
errstr = 

Ver también bug #49295.

+1

'stream_socket_client' funcionó muy bien, gracias. Un problema es la imposibilidad de detectar tiempos de espera en las conexiones asincrónicas. He publicado mi solución aquí: http://stackoverflow.com/questions/3333398/php-get-socket-error-string-when-async-connect-fails/4114499#4114499 – CAMason

+0

@Craig ¿Qué versión estás utilizando? Es posible que se haya presentado un error recientemente, porque estoy experimentando los problemas que he descrito. – Artefacto

+0

5.3.3 en Ubuntu. No veo ninguna advertencia en modo SSL. – CAMason

Cuestiones relacionadas