【问题标题】:How to make context array for set socks 5 or http proxy for php stream_socket_client如何为 set socks 5 或 php stream_socket_client 的 http 代理制作上下文数组
【发布时间】:2017-05-09 17:16:01
【问题描述】:

我不确定如何在 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 协议的上下文。

如何配置tcp流套接字的上下文参数数组?

【问题讨论】:

    标签: php sockets tcp proxy


    【解决方案1】:

    您可以使用流,根据您的示例,您需要一个客户端流套接字。

    查看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 应该足够了。

    【讨论】:

    • 感谢您的回答。
    • 代理上下文完全被stream_socket_client()忽略php.net/manual/en/context.socket.php
    • @tim 我在该页面或stream_socket_client 上找不到任何关于在上下文中忽略代理的内容。你能指点一下吗?
    • 该页面列出了支持的参数。我刚刚尝试为代理设置一个值,它在 PHP 7.2 中被完全忽略了。
    • @tim 我明白了。我不记得使用它,所以也许你是对的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 2012-07-21
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多