php - 如何为 set socks 5 或 php stream_socket_client 的 http 代理制作上下文数组

标签 php sockets tcp proxy

我不确定如何在 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/

相关文章:

c++ - 如何将 boost asio tcp 套接字传递给线程以向客户端或服务器发送心跳

php - Yii:如何将 yiiGridView.js 事件绑定(bind)到延迟加载的 CGridView

php - 如何解决IF STATEMENT中有关$ _GET [“view”]的错误?

c - C中从套接字中读取消息

python - 通过代理服务器进行socket编程

iphone - 使用 iPhone 应用程序中的 CONNECT 方法通过 SSL 实现 HTTP 代理

php - 从 php 页面收集 MySQL 组合框选择

javascript - 如何将 Span Id 值放入 PHP 变量中?

sockets - 当 boost.asio 流上有一些数据需要读取而不将其读入缓冲区时,如何获得回调?

tcp - Web 服务客户端遇到 'java.net.SocketException: Connection reset'