我不确定如何在 php 中为流套接字的 tcp 代理配置流上下文参数。我发现并测试了以下代码,但它不适用于流套接字。
$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 协议(protocol)。
如何为 tcp 流套接字配置上下文参数数组?
最佳答案
您可以使用流,根据您的示例,您需要一个客户端流套接字。
看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
应该足够了。
关于php - 如何为 set socks 5 或 php stream_socket_client 的 http 代理制作上下文数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41310932/