在 PHP 中使用 CURL multi execute with follow location 时是否可以获取原点 URL?
Is it possible to get the origin URL when using a CURL multi execute in PHP with follow location?
我们正在制作一个脚本,用于检查我们系统中的 link 是否存在无效状态代码。例如,有人在我们的网站上创建了一个页面,用 link 填充了它,但是多年后,某些 url 不正确(4xx/5xx 状态代码)。
请检查 link 是否有效,我制作了一个 curl 片段来获取状态代码。由于link的数量,我使用curl_multi_exec到运行异步。
但是,现在我遇到了一个问题。如果 url 的状态码为 3xx,则表示存在重定向。在这种情况下,我必须遵循 "real" url 并获取该状态代码。 PHP 有一个 curl 选项:CURLOPT_FOLLOWLOCATION
.
问题是:当有重定向时,服务器 returns 正确的状态码,错误的 URL。我们必须用 "destination" URL.
的状态代码更新 "origin" URL 的状态代码
例如:
假设 http://example.com 重定向到 https://example.com
在这种情况下,我们会收到 https://example.com 的状态码,但我们必须在 http://example.com.[=18 的记录中更新该状态码=]
这是我制作的片段:
// 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();
添加一个URL:
$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);
所以,基本上:我想接收起点 url 而不是目的地 url。这可能吗?
您需要使用 CURLOPT_RETURNTRANSFER 要求 CURL return headers 并自行查找重定向指令。此处对此进行了描述:
我们正在制作一个脚本,用于检查我们系统中的 link 是否存在无效状态代码。例如,有人在我们的网站上创建了一个页面,用 link 填充了它,但是多年后,某些 url 不正确(4xx/5xx 状态代码)。
请检查 link 是否有效,我制作了一个 curl 片段来获取状态代码。由于link的数量,我使用curl_multi_exec到运行异步。
但是,现在我遇到了一个问题。如果 url 的状态码为 3xx,则表示存在重定向。在这种情况下,我必须遵循 "real" url 并获取该状态代码。 PHP 有一个 curl 选项:CURLOPT_FOLLOWLOCATION
.
问题是:当有重定向时,服务器 returns 正确的状态码,错误的 URL。我们必须用 "destination" URL.
的状态代码更新 "origin" URL 的状态代码例如: 假设 http://example.com 重定向到 https://example.com 在这种情况下,我们会收到 https://example.com 的状态码,但我们必须在 http://example.com.[=18 的记录中更新该状态码=]
这是我制作的片段:
// 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();
添加一个URL:
$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);
所以,基本上:我想接收起点 url 而不是目的地 url。这可能吗?
您需要使用 CURLOPT_RETURNTRANSFER 要求 CURL return headers 并自行查找重定向指令。此处对此进行了描述: