如何为php stream_socket_客户端的set socks 5或http代理创建上下文数组

如何为php stream_socket_客户端的set socks 5或http代理创建上下文数组,php,sockets,tcp,proxy,Php,Sockets,Tcp,Proxy,我不确定如何在php中为流套接字的tcp代理配置流上下文参数。我发现并测试了以下代码,但它不适用于stream Socket $context = stream_context_create( array( 'http'=>array( 'proxy'=> 'tcp://'.$proxy, ) )

我不确定如何在php中为流套接字的tcp代理配置流上下文参数。我发现并测试了以下代码,但它不适用于stream Socket

$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\u get\u 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流套接字配置上下文参数数组?

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

查看以创建tcp套接字。请注意最后一个参数,
$context
,该参数应使用创建

手册中有足够的例子,但这里是关于如何使用它的

$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);

还要注意的是,它也接受上下文,并且也适用于tcp流。流扩展函数提供了更多选项,但对于基本用途而言,
fopen
应该足够了。

感谢您的回答。stream\u socket\u client()完全忽略了代理上下文。@tim我在该页面或
stream\u socket\u client
中找不到关于在上下文中忽略代理的任何内容。你能指出它吗?页面列出了支持哪些参数。我只是尝试为代理设置一个值,但在PHP7.2中它被完全忽略了。@tim我明白了。我不记得用过,所以也许你是对的。谢谢