PHP curl如何在使用代理时检索标头.CURLOPT_HEADERFUNCTION


PHP curl how to retrieve headers when using Proxy. CURLOPT_HEADERFUNCTION?

我正在使用这样的代理连接到一个站点:

$curl = curl_init();
curl_setopt($curl, CURLOPT_PROXY, $proxy);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, 1); 
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);  
curl_setopt($curl, CURLOPT_HEADER, TRUE);
$result = curl_exec ($curl);

问题是CURLOPT_HEADER从代理连接返回报头,而我需要从实际请求到URL的报头。我相信解决方案包括使用CURLOPT_HEADERFUNCTION,但我不知道如何使用它。

我试过这个(从其他地方从SO):

curl_setopt($curl, CURLOPT_HEADERFUNCTION, "HandleHeaderLine");
使用功能:

function HandleHeaderLine($curl, $header_line ) {
    echo "<br>YEAH: ".$header_line; // or do whatever
    return strlen($header_line);
}

但似乎我只能返回字节数。我不确定如何得到实际的值。在我的情况下,我只想要Location头。

谢谢。

CURLOPT_HEADERFUNCTION的匿名回调将需要访问您想要存储头信息的变量。有几种不同的方法,但这里有一些示例:

使用use:

$headers = [];
...
function HandleHeaderLine($curl, $header_line) use (&$headers)
{
    ...
    if ($isHeaderIWant) {
        $header[] = 'some info';
    }
    return strlen($header_line);
}

使用类属性:

private $headers = [];
...
function HandleHeaderLine($curl, $header_line)
{
    ...
    if ($isHeaderIWant) {
        $this->header[] = 'some info';
    }
    return strlen($header_line);
}