2010-07-26 57 views
1

任何人都知道是否有可能检索到一些错误信息(如C中的getsockopt SO_ERROR)如果异步连接如下失败 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); 
} 

THX

回答

1

我遇到了与上述相同的问题。我找到了一些解决方法:

我将每个'流'都包装在Stream类中,并设置了超时属性。在我调用connect之前,我生成了应该发生超时的时间戳。然后,我在Manager类中有一个循环,它调用stream_select()

成功的连接放置在$write阵列中。我在呼叫$stream->checkTimeout()的循环底部有另一个呼叫。其中有一个stream_select()呼叫,其中0设为tv_sectv_usec。如果$ this-> conn没有出现在$write内,我认为它已超时。

0

据我了解流函数错误应该生成PHP警告消息。我认为唯一的方法是使用set_error_handler()来捕获这些并在那里处理它们。

0

我也遇到了这个问题。我找到的解决方案是使用stream_socket_get_name。如果你想把这一切都包装在一个不错的图书馆结帐http://drupal.org/project/httprl。它仍然需要drupal,但主要用于设置&错误处理;你可以稍微修改一下代码,它应该自己运行。