PHP stream_socket_client无法通过代理工作的技术求助
解决stream_socket_client无法使用HTTP代理的问题
我来帮你搞定这个问题!你遇到的核心问题是:stream_socket_client并不会自动识别你设置的HTTP代理上下文——那个http上下文里的proxy配置只对基于HTTP协议的高层函数(比如file_get_contents)生效,而stream_socket_client是底层的TCP套接字连接工具,得手动处理代理的CONNECT请求才能通过代理建立连接。
下面是修正后的完整代码,我会一步步解释逻辑:
<?php // 代理服务器配置 $proxyHost = '147.135.210.114'; $proxyPort = 54566; // 目标服务器配置 $targetHost = 'www.google.com'; $targetPort = 80; // 第一步:先连接到代理服务器,而不是直接连目标服务器 $fp = stream_socket_client("tcp://{$proxyHost}:{$proxyPort}", $errno, $errstr, 30, STREAM_CLIENT_CONNECT); if (!$fp) { echo "$errstr ($errno)<br />"; exit; } // 第二步:向代理发送CONNECT请求,要求它建立到目标服务器的TCP隧道 $connectRequest = "CONNECT {$targetHost}:{$targetPort} HTTP/1.1\r\n"; $connectRequest .= "Host: {$targetHost}:{$targetPort}\r\n"; $connectRequest .= "Connection: close\r\n\r\n"; fputs($fp, $connectRequest); // 第三步:验证代理的响应,确认隧道是否成功建立 $proxyResponse = fread($fp, 8192); if (!strpos($proxyResponse, 'HTTP/1.1 200')) { echo "代理隧道建立失败: {$proxyResponse}<br />"; fclose($fp); exit; } // 第四步:现在可以像直接连接目标服务器一样发送HTTP请求了 $httpRequest = "GET / HTTP/1.0\r\n"; $httpRequest .= "Host: {$targetHost}\r\n"; $httpRequest .= "Connection: close\r\n\r\n"; fputs($fp, $httpRequest); // 读取并输出目标服务器的响应 while (!feof($fp)) { echo fgets($fp, 128); } fclose($fp); ?>
关键逻辑说明:
- 连接代理而非目标服务器:
stream_socket_client要先和代理建立TCP连接,而不是直接连Google - 发送CONNECT请求:这是HTTP代理提供隧道服务的标准方式,告诉代理“帮我连接到目标服务器的指定端口”
- 验证代理响应:必须确保代理返回
HTTP/1.1 200状态码,说明隧道已经成功建立,之后才能和目标服务器通信 - 额外情况处理:如果你的代理需要用户名密码认证,要在
CONNECT请求里加上Proxy-Authorization头:$connectRequest .= "Proxy-Authorization: Basic " . base64_encode("你的用户名:你的密码") . "\r\n";
内容的提问来源于stack exchange,提问作者chudzini
相关产品推荐
相关产品推荐

