2010-11-06 22 views
5

È possibile utilizzare socket_create/socket_connect su SSL in modalità non bloccante?Connessione socket non bloccante su SSL?

Attualmente sto usando \fsockopen() che supporta in modo nativo un prefisso 'ssl: //'. Tuttavia, fsockopen() verrà bloccato fino a quando non viene stabilita la connessione. Questo non è auspicabile in uno script che può avere circa 50 socket simultanei in attesa di essere letti.

Ho creato uno script di test per utilizzare \socket_create(), che può essere commutato in modalità non bloccante prima che venga chiamato \socket_connect(). Tuttavia, non sembra avere alcun supporto per le connessioni SSL (a differenza del wrapper fsockopen()).

risposta

3

La risposta sarebbe utilizzare invece stream_socket_client con la bandiera STREAM_CLIENT_ASYNC_CONNECT; tuttavia sembra che ci sia qualche bug 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; 
} 

Su Linux sembra esserci un ciclo 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) 

Su qualche variante BSD su 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 = 

See anche bug #49295.

+1

'stream_socket_client' ha funzionato benissimo, grazie. Un problema è l'impossibilità di rilevare i timeout sulle connessioni asincrone. Ho postato la mia soluzione qui: http://stackoverflow.com/questions/3333398/php-get-socket-error-string-when-async-connect-fails/4114499#4114499 – CAMason

+0

@Craig Quale versione stai usando? Potrebbe esserci stato un bug introdotto di recente, perché sto riscontrando i problemi che ho descritto. – Artefacto

+0

5.3.3 su Ubuntu. Non vedo alcun avviso in modalità SSL. – CAMason