在PHP中使用CURL多执行并跟随位置时,是否可以获取原始URL?

时间:2018-02-11 21:20:46

标签: php curl curl-multi

我们正在编写一个脚本,检查系统中的链接是否存在无效的状态代码。例如,有人在我们的网站上创建了一个页面,并用链接填充,但多年后,一些网址不正确(4xx / 5xx状态代码)。

检查链接是否有效,我已经制作了一个卷曲片段来获取状态代码。由于链接的数量,我使用curl_multi_exec来运行异步。

但是,现在我遇到了问题。如果网址的状态代码为3xx,则表示存在重定向。在那种情况下,我要关注"真实" url并获取该状态码。 PHP有一个卷曲选项:CURLOPT_FOLLOWLOCATION

问题在于:当存在重定向时,服务器会返回正确的状态码,并且URL不正确。我们必须更新" origin"的状态代码。具有"目的地"的状态代码的URL URL。

例如: 让我们说http://example.com重定向到http s :// example.com 在这种情况下,我们会收到http s :// example.com的状态代码,但我们必须在http://example.com的记录上更新该状态代码。

以下是我制作的片段:

// CURL Options
$options = array(
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER         => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_ENCODING       => "",
    CURLOPT_AUTOREFERER    => true,
    CURLOPT_CONNECTTIMEOUT => 10,
    CURLOPT_TIMEOUT        => 10,
    CURLOPT_NOBODY         => true
);

// Init CURL Multi
$mh = curl_multi_init();

添加网址:

$ch = curl_init(trim($RowFromDatabase->Url));
curl_setopt_array($ch, $options);
curl_multi_add_handle($mh, $ch);

这是我执行所有检查的地方:

do {
    // Run all URL's
    while(($exec = curl_multi_exec($mh, $running)) == CURLM_CALL_MULTI_PERFORM);
    if($exec != CURLM_OK) {
        break;
    }

    // Get info about URL's
    while($ch = curl_multi_info_read($mh)) {
        $ch = $ch['handle'];

        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $info = curl_getinfo($ch);

        // URL (this is the destination URL, I would like to get the origin URL here)
        $url = $info['url'];

        $broken = false;

        if($httpCode >= 400){
            $broken = true;
        }

        if($broken){
            // Update broken in database
            $QueryBroken->bind_param("s",$url);
            $QueryBroken->execute();
        }

        // Handle
        curl_multi_remove_handle($mh, $ch);
        curl_close($ch);                
    }
} while($running);
curl_multi_close($mh);

所以,基本上:我想收到原始网址而不是目标网址。这可能吗?

1 个答案:

答案 0 :(得分:0)

你需要让CURL使用CURLOPT_RETURNTRANSFER返回标题,并自己查找重定向指令。这在这里描述:

http://zzz.rezo.net/HowTo-Expand-Short-URLs.html