【问题标题】:curl set server address instead proxy [duplicate]curl设置服务器地址而不是代理[重复]
【发布时间】:2019-03-03 14:34:26
【问题描述】:

对不起这个问题,但我已经 3 天不知道错误在哪里。我在自己的网站上有一个页面,显示用户的 IP 地址如下:

<?php
echo "<br>"."Your IP address :"."<br>";
echo @$_SERVER['HTTP_CLIENT_IP']."<br>";
echo @$_SERVER['HTTP_X_FORWARDED_FOR']."<br>";
echo @$_SERVER['REMOTE_ADDR']."<br>"
?>

当我通过 curl 只发送一个请求时,此页面显示代理地址,完全符合我的要求:

$ch = curl_init("http://mysite/youIp.php");
$proxy = '180.210.205.107:3128';
curl_setopt($ch, CURLOPT_PROXY, $proxy); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$curl_scraped_page = curl_exec($ch);
$result = curl_exec($ch);
echo $result;
curl_close($ch);

结果:

但是当我尝试通过 curl 函数使用多个请求时都失败了:

$proxy = '180.210.205.107:3128';
function multirequest($urls)
{
    $multi = curl_multi_init();
    $handles = []; 
    $htmls = [];

    for($i=0; $i<count($urls);$i++)
    { 
        $url = $urls[$i]; 
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_PROXY, $proxy); 
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_multi_add_handle($multi, $ch);
        $handles[$url] = $ch; 
    }   

    do {  
        $mrc = curl_multi_exec($multi, $active);  
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);

    while ($active && $mrc == CURLM_OK) 
    {
        if (curl_multi_select($multi) == -1) 
        {
            usleep(1);
        }

        do
        {
            $mrc = curl_multi_exec($multi, $active);
        }while($mrc == CURLM_CALL_MULTI_PERFORM);
    }

    foreach($handles as $channel)
    {
        $html = curl_multi_getcontent($channel);
        $htmls[] = $html;
        curl_multi_remove_handle($multi, $channel);
    }

    curl_multi_close($multi);
    return $htmls;
}

从数组运行对 url 的请求(实际上,$urls 只包含 1 个 url - 到我自己的页面):

var_dump($urls);
// only 1 url -> http://mysite/youIp.php
foreach($urls as $url)
{
    $htmls = multirequest($url);
    foreach($htmls as $html)
    {
        echo $html;
    }
}

结果我看到了我的服务器 IP 地址:

我不知道为什么这段代码不起作用。如果您看到我在哪里犯了错误,请帮忙。谢谢!

【问题讨论】:

  • 您需要在函数中声明global $proxy;。如果您没有收到有关未定义变量的警告,则需要启用 error_reporting(E_ALL) 才能看到它。

标签: php curl


【解决方案1】:

也许改变一下

$proxy = '180.210.205.107:3128';
function multirequest($urls)
{
    $multi = curl_multi_init();
    $handles = []; 
    $htmls = [];
    // ...

到这里

function multirequest($urls)
{
    $proxy = '180.210.205.107:3128';
    $multi = curl_multi_init();
    $handles = []; 
    $htmls = [];
    // ...

也就是说,在函数内部定义$proxy

【讨论】:

  • global $proxy; 在函数内部也可以工作,正如@Barmar 所提到的
  • 天哪!太愚蠢了!非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
  • 2021-10-24
  • 2020-12-01
相关资源
最近更新 更多