PHP 的 HTTP 代理上下文不会重新配置原始 TCP 流
区分 PHP HTTP 包装器的代理选项与 stream_socket_client TCP 连接所需的协议工作。
HTTP 上下文的 proxy 选项属于 PHP 的 HTTP 流包装器。由 stream_socket_client 创建的原始 TCP 连接不会仅仅因为该选项存在于某个上下文对象中,就变成 HTTP 代理客户端。
如果代码直接连接目标地址,它打开的就是那条 TCP 路由。如果改为连接代理地址,接下来的字节仍然需要实现代理协议。
对于 HTTP CONNECT,这意味着有效的目标主机和端口、任何所需的代理认证、完整的响应解析,以及在目标协议开始之前完成接受。单次 fread 调用只搜索成功短语,并不是完整的连接器。TCP 可能把响应拆到多次读取中,或返回必须保留的额外字节。
对于 HTTPS 目标,随后 TLS 必须通过已建立的隧道启动,并验证目标身份。代理主机名不是网站的证书身份。
当任务只是获取 URL 时,使用对所要求代理协议有文档化支持的客户端或连接器。PHP cURL 的 HTTP 与 SOCKS 设置提供了一条受支持的 URL 获取路径。当应用自己承担那部分底层协议工作时,原始流才有用;它不应悄悄继承无关 HTTP 包装器示例中的假设。