2016-12-24 48 views
3

我不知道如何在php中爲流式套接字配置tcp代理的流上下文參數。我發現並測試了以下代碼,但它不適用於流式套接字。如何爲php設置襪子5或http代理的上下文數組stream_socket_client

$context = stream_context_create(
      array(
       'http'=>array(
       'proxy'=> 'tcp://'.$proxy,     
       ) 
      ) 
      ); 
$srvHandle = stream_socket_client("tcp://{$this->server}", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context); 
if ($srvHandle === false) 
    $this->LogError("failed to connect with host website, check your network connection."); 
stream_set_blocking($srvHandle, true); 
stream_socket_enable_crypto($srvHandle, true, STREAM_CRYPTO_METHOD_TLS_CLIENT); 
stream_set_blocking($srvHandle, false); 

但是上下文對file_get_contents函數有效。

$context = stream_context_create(
      array(
       /* 
       'socket' => array(
        'bindto' => $proxy, 
       )  
       */ 
       'http'=>array(
       'proxy'=> 'tcp://'.$proxy, 
       "request_fulluri" => TRUE, 
       ), 
       "ssl" => array(
       "SNI_enabled" => FALSE, 
       ) 
      ) 
      ); 

$result = file_get_contents("http://api.ipify.org?format=json", false, $context); 

所以我可以知道僅適用於http協議的上下文。

如何配置tcp流套接字的上下文參數數組?

回答

0

你可以使用流,根據你的例子你需要一個客戶端流套接字。

stream_socket_client創建一個tcp套接字。請注意最後一個參數$context,應該使用stream_context_create創建。

有足夠手冊的例子,但在這裏它是如何使用它

$context = stream_context_create(
      array(
       /* 
       'socket' => array(
        'bindto' => $proxy, 
       )  
       */ 
       'http'=>array(
       'proxy'=> 'tcp://'.$proxy, 
       "request_fulluri" => TRUE, 
       ), 
       "ssl" => array(
       "SNI_enabled" => FALSE, 
       ) 
      ) 
      ); 

$fp = stream_socket_client("tcp://www.example.com:80", $errno, $errstr, 30, ini_get("default_socket_timeout"), STREAM_CLIENT_CONNECT, $context); 

還要注意的是fopen也接受的範圍內,並且可與TCP數據流過。流擴展功能提供更多選項,但對於基本使用fopen應該足夠了。

+0

謝謝你的回答。 –