2010-07-26 60 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,但主要用於設置&錯誤處理;你可以稍微修改一下代碼,它應該自己運行。