кто-нибудь знает, может ли его получить некоторую информацию об ошибке (например, getsockopt SO_ERROR в C), если асинхронное соединение, например, следующее: btw: im не использует потоки причин расширения сокета, предоставляет оболочку 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); }
спасибо
У меня такая же проблема, как описано. Я нашел немного обходного пути:
Я переношу каждый из моих «потоков» в класс Stream
и устанавливаю свойство тайм-аута. Прежде чем я вызову connect, я создаю отметку времени, когда должен произойти тайм-аут. Затем у меня есть цикл в классе Manager
который вызывает stream_select()
.
Успешные соединения помещаются в массив $write
. У меня есть другой вызов в нижней части цикла, который вызывает $stream->checkTimeout()
. Внутри этого есть вызов tv_sec
stream_select()
с 0, установленным для tv_sec
и tv_usec
. Если $ this-> conn не появляется в $write
, я предполагаю, что он был исчерпан.
Насколько я понимаю, ошибки в потоковых функциях должны генерировать предупреждающие сообщения PHP. Я думаю, что единственный способ – поймать их с помощью set_error_handler () и обработать их там.
Я столкнулся с этим вопросом. Решение, которое я нашел, это использовать stream_socket_get_name . Если вы хотите, чтобы все это было завершено в хорошей библиотечной проверке http://drupal.org/project/httprl . Он по-прежнему требует drupal, но в основном для настроек и обработки ошибок; вы можете немного изменить код, и он должен работать сам по себе.