Неблокирующее сокетное соединение по SSL? - PullRequest
5 голосов
/ 06 ноября 2010

Можно ли использовать socket_create / socket_connect по SSL в неблокирующем режиме?

В настоящее время я использую \fsockopen(), который изначально поддерживает префикс «ssl: //».Однако fsockopen() будет блокироваться до тех пор, пока не будет установлено соединение.Это нежелательно в сценарии, который может иметь около 50 одновременных сокетов, ожидающих чтения.

Я создал тестовый сценарий для использования \socket_create(), который можно переключить в неблокирующий режим до \socket_connect()называется.Однако он не поддерживает SSL-соединения (в отличие от оболочки fsockopen()).

1 Ответ

3 голосов
/ 06 ноября 2010

Ответом будет использование вместо stream_socket_client с флагом STREAM_CLIENT_ASYNC_CONNECT; однако, похоже, что в 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;
}

В Linux существует бесконечный цикл с:

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)

В некоторых вариантах BSD на 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 = 

См. Также ошибка # 49295 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...