You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PHP中使用带账号密码的代理通过stream_socket_client发起请求?

使用stream_socket_client通过带认证的代理发起请求

完全可以实现,具体操作分为以下几步:

1. 完善上下文配置,添加代理认证信息

在你已有的上下文数组中,添加proxy_authentication字段,值为经过Base64编码的用户名:密码字符串。示例如下:

// 代理账号密码
$proxyUser = 'your_username';
$proxyPass = 'your_password';
// 生成Base64编码的认证字符串
$auth = base64_encode("$proxyUser:$proxyPass");

$ctx = stream_context_create([
    'tcp' => [
        'proxy' => 'tcp://127.0.0.1:8888',
        'proxy_authentication' => $auth,
    ]
]);

2. 结合stream_socket_client使用代理

注意:stream_socket_client是底层套接字工具,连接代理后需要手动向代理发送目标服务器的请求指令,以HTTP代理为例,完整代码示例如下:

// 目标服务器地址和端口
$targetHost = 'example.com';
$targetPort = 80;

// 创建带代理认证的上下文
$proxyUser = 'your_username';
$proxyPass = 'your_password';
$auth = base64_encode("$proxyUser:$proxyPass");
$ctx = stream_context_create([
    'tcp' => [
        'proxy' => 'tcp://127.0.0.1:8888',
        'proxy_authentication' => $auth,
    ]
]);

// 连接代理服务器
$socket = stream_socket_client(
    "tcp://127.0.0.1:8888",
    $errno,
    $errstr,
    30,
    STREAM_CLIENT_CONNECT,
    $ctx
);

if (!$socket) {
    die("连接代理失败: $errstr ($errno)");
}

// 向代理发送HTTP请求(目标地址要完整)
$request = "GET http://{$targetHost}:{$targetPort}/ HTTP/1.1\r\n";
$request .= "Host: {$targetHost}\r\n";
$request .= "Connection: close\r\n\r\n";
fwrite($socket, $request);

// 读取响应
$response = '';
while (!feof($socket)) {
    $response .= fgets($socket, 1024);
}

// 关闭套接字
fclose($socket);

// 输出响应
echo $response;

关键说明

  • 如果你的代理是SOCKS5类型,上下文配置中的proxy字段需要改为socks5://127.0.0.1:端口,同时请求指令无需携带完整URL,直接发送目标主机的IP和端口即可。
  • proxy_authentication字段的Base64编码不需要额外添加Basic 前缀,PHP的流上下文会自动处理这部分。
  • 要注意超时时间设置,避免连接或请求过程中长时间阻塞。

内容的提问来源于stack exchange,提问作者user3022527

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 05:07:13