получить строку ошибки сокета при сбое асинхронного подключения - PullRequest
2 голосов
/ 26 июля 2010

кто-нибудь знает, возможно ли получить некоторую информацию об ошибке (например, getsockopt SO_ERROR в C), если асинхронное соединение, подобное следующему, не удается кстати: я не использую расширение сокета, потому что потоки предоставляют оболочку ssl

<?php
$ctx = stream_context_create();
stream_context_set_params($ctx, array("notification" => "stream_notification_callback"));
$destination = "tcp://92.247.12.242:8081";
$socket = stream_socket_client($destination, $errno, $errstr,
                                         10, STREAM_CLIENT_CONNECT | STREAM_CLIENT_ASYNC_CONNECT, $ctx);a
// plain socket
var_dump($socket);
// no error as expected
var_dump($errno);
var_dump($errstr);

stream_set_blocking($socket, false);

/* Prepare the read array */
$read   = array($socket);
$write  = array($socket);
$except = NULL;
if (false === ($num_changed_streams = stream_select($read, $write, $except, 10))) {
    var_dump("select failed?");
    /* Error handling */
} elseif ($num_changed_streams > 0) {

    /* At least on one of the streams something interesting happened */
    var_dump("event");
    // read fails, so the connect fails but why?
    $result = stream_socket_recvfrom($socket, 1024);
    var_dump($result);
    // no error again
    var_dump($errno);
    var_dump($errstr);
    // nothing interesting
    var_dump(stream_get_meta_data($socket));
}
// wont get called
function stream_notification_callback($notification_code, $severity, $message, $message_code, $bytes_transferred, $bytes_max) {
    $args = func_get_args();
    var_dump($args);
}

ТНХ

Ответы [ 3 ]

1 голос
/ 06 ноября 2010

У меня та же проблема, что и описанная. Я нашел немного обходного пути:

Я обертываю каждый из своих «потоков» в класс Stream и задаю свойство тайм-аута. Прежде чем я вызову connect, я генерирую метку времени, когда должен произойти тайм-аут. Затем у меня есть цикл в Manager классе, который вызывает stream_select().

Успешные соединения помещаются в массив $write. У меня есть еще один вызов в нижней части цикла, который вызывает $stream->checkTimeout(). В пределах этого есть stream_select() вызов с 0, установленным для tv_sec и tv_usec. Если $ this-> conn не появляется в $write, я предполагаю, что время истекло.

0 голосов
/ 22 февраля 2012

Я тоже столкнулся с этой проблемой.Я нашел решение использовать stream_socket_get_name .Если вы хотите, чтобы все это было упаковано в симпатичную библиотечную проверку http://drupal.org/project/httprl. Это все еще требует drupal, но в основном для настроек и обработки ошибок;Вы можете немного изменить код, и он должен работать самостоятельно.

0 голосов
/ 26 июля 2010

Насколько я понимаю, ошибки в функциях потока должны генерировать предупреждающие сообщения PHP. Я думаю, что единственным способом было бы перехватить их с помощью set_error_handler () и обработать их там.

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