簡體   English   中英

PHP stream_socket_client 不使用代理

[英]PHP stream_socket_client not using proxy

我正在嘗試讓 stream_socket_client 與代理服務器一起工作。

代碼和平:

<?php 
$context = stream_context_create(['http' => ['proxy' => '147.135.210.114:54566', 'request_fulluri' => true]]);
//$file = file_get_contents("http://www.google.com", false, $context);
$fp = stream_socket_client("tcp://www.google.com:80", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    fputs($fp, "GET / HTTP/1.0\r\nHost: www.google.com\r\nAccept: */*\r\n\r\n");
    while (!feof($fp)) {
        echo fgets($fp, 1024);
    }
    fclose($fp);
}
?>

雖然 file_get_contents 使用代理(tcpdump -i any -A host 114.ip-147-135-210.eu),但 stream_socket_client 只是省略了它並直接轉到 google.com。 我做錯了什么? 我的最終目標是通過代理連接到 RabbitMQ(AMQP 協議),但我什至無法讓簡單的 HTTP 連接工作。

如果有人來這里掙扎,我最終通過首先連接到代理然后發出 http 標頭來獲取我想要的內容來解決這個問題。

首先為代理創建套接字:

 $sock = stream_socket_client(
        "tcp://$proxy:$port",
        $errno,
        $errstr,30,
        STREAM_CLIENT_CONNECT,
        stream_context_create()
 );

第二次連接到你想要的目標主機:

$write =  "CONNECT www.example.org HTTP/1.1\r\n";
$write .= "Proxy-Authorization: Basic ".base64_encode("$proxy_user:$proxy_pass)."\r\n";
$write .= "\r\n";
fwrite($sock, $write);

這應該返回一個 200 代碼:

preg_match('/^HTTP\/\d\.\d 200/', fread($sock, 1024));

現在您只需發出 GET(確保發送所有 HTTP 標頭):

fwrite($sock, "GET / HTTP/1.1\r\n")

這有更多詳細信息: https : //stackoverflow.com/a/55010581/687976

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM