我有兴趣了解测试服务器响应代码(如 404)的 URL 的最佳/最精简方法是什么。我目前正在使用与 php 手册评论中非常相似的东西get_headers:
<?php
function get_http_response_code($theURL) {
$headers = get_headers($theURL);
return substr($headers[0], 9, 3);
}
if(intval(get_http_response_code('filename.jpg')) < 400){
// File exists, huzzah!
}
?>
但是,在 foreach 例程中对超过 50+ 个 URL 使用此扩展通常会导致我的服务器放弃并报告 500 响应(请原谅对确切错误的模糊性)。所以,我想知道是否有一种方法资源较少,并且可以批量检查 URL 响应代码?
您可以使用
curl_multi_*
函数同时执行多个 curl 请求。
但是,这仍然会阻止执行,直到返回最慢的请求(以及一些额外的响应时间进行响应解析)。
像这样的任务应该使用 cronjobs 或更简单的替代方案在后台执行。
此外,github和co.上有多个库,它们包装了curl扩展以提供更好的API。
这个概念解析为:(Ren@php-docs的cpu"修复")
function getStatusCodes(array $urls, $useHead = true) {
$handles = [];
foreach($urls as $url) {
$options = [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_NOBODY => $useHead,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HEADER => 0
];
$handles[$url] = curl_init();
curl_setopt_array($handles[$url], $options);
}
$mh = curl_multi_init();
foreach($handles as $handle) {
curl_multi_add_handle($mh, $handle);
}
$running = null;
do {
curl_multi_exec($mh, $running);
curl_multi_select($mh);
} while ($running > 0);
$return = [];
foreach($handles as $handle) {
$return[$eUrl = curl_getinfo($handle, CURLINFO_EFFECTIVE_URL)] = [
'url' => $eUrl,
'status' => curl_getinfo($handle, CURLINFO_HTTP_CODE)
];
curl_multi_remove_handle($mh, $handle);
curl_close($handle);
}
curl_multi_close($mh);
return $return;
}
var_dump(getStatusCodes(['http://google.de', 'http://stackoverflow.com', 'http://google.de/noone/here']));