`curl` 不起作用并且不给出任何消息

`curl` 不起作用并且不给出任何消息

我有一个使用curl 检查地址的脚本,但是为什么像下面这样的一些地址会挂起?我可以做什么来避免它?查看此地址以了解更多信息

curl https://10.10.34.36/test

我的脚本:

$sites = file_get_contents('./sites.json');
$sites = json_decode($sites);
function get_html_title($html){
    preg_match("/\<title.*\>(.*)\<\/title\>/isU", $html, $matches);
    return $matches[1];
}
function get_redirect_target($url)
{
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); 
    
// The maximum number of seconds to allow cURL functions to execute.
    curl_setopt($ch, CURLOPT_TIMEOUT, 8); //timeout in seconds
    $headers = curl_exec($ch);
    curl_close($ch);

    $result = array("old"=>$url);
    // Check if there's a Location: header (redirect)
    if (preg_match('/^Location: (.+)$/im', $headers, $matches)){
        $result["new"] = trim($matches[1]); 
        $html = file_get_contents($result["new"]);
        $title = get_html_title($html);
        $result["title"] = trim($title); 
        return $result;
    }
       

    // If not, there was no redirect so return the original URL
    return "";
}
function get_redirect_final_target($url)
{
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // follow redirects
    curl_setopt($ch, CURLOPT_AUTOREFERER, 1); // set referer on redirect
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.6045.105 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)");
    curl_exec($ch);
    $target = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
    curl_close($ch);

    if ($target)
        return $target;

    return false;
}
$redirectsList = array();
foreach($sites as $key=>$site){
    $res=get_redirect_final_target($site->url);
    if($res!=$site->url){
    $html = file_get_contents($res);
    $title = get_html_title($html);
    $result["title"] = trim($title);     
    $newurl = ["old"=>$site->url,"new"=>$res,"title"=>$title];
        array_push($redirectsList,$newurl);
        $sites[$key]->url = $newurl['new'];
    }
}
file_put_contents('./sites5.json', json_encode($sites, JSON_UNESCAPED_SLASHES|JSON_PRETTY_PRINT));
echo '<table border="1">';
    echo '<tr>';
       echo '<td>Old url</td>';
       echo '<td>New url</td>';
       echo '<td>Title</td>';
    echo '</tr>';
foreach($redirectsList  as $record){
    echo '<tr>';
       echo '<td>'.$record['old'].'</td>';
       echo '<td>'.$record['new'].'</td>';
       echo '<td>'.$record['title'].'</td>';
    echo '</tr>';
}
echo '</table>';

我的 json 文件:

[
    {
        "url": "https://10.10.34.36/test"
    },
    {
        "url": "https://google.com/"
    }
]

答案1

那是一个私有IP地址。我们不可能知道你那里有什么样的服务器 - 但知道它curl的广泛性、测试的充分性以及健壮性,我敢于将其诊断为:

您位于 10.10.34.36 的服务器可能根本不存在,它可能挂起或行为不当,或者您的网络设置以某种方式损坏(代理配置错误,没有到主机的路由......)。所有这一切都比curlnbot 正常工作的可能性要大得多。

答案2

它不太可能“挂起”——它可能正在等待另一端响应。我不会尝试你的测试用例,因为我的结果会与你和大多数其他人的结果不同; 10.0.0.0/8 是私有范围。

你可以限制curl库尝试完成请求所花费的时间与 CURLOPT_TIMEOUT[_MS]

相关内容