Какой самый эффективный способ текстовых URL-адресов для 404 ошибок

Мне интересно узнать, каков наилучший / наименьший способ проверки URL-адресов для кодов ответов сервера, таких как 404.
В настоящее время я использую нечто очень похожее на то, что можно найти в комментариях к руководству по 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!
}
?>

Но использование этого масштабированного для более чем 50+ URL-адресов в процедуре foreach обычно приводит к тому, что мой сервер сдается и сообщает о 500 ответах (извините за неопределенность в отношении точной ошибки). Итак, мне интересно, если есть метод, который является менее ресурсоемким, и может ли проверить коды ответов URL по массе?

0

Решение

Вы можете выполнить несколько запросов curl одновременно, используя curl_multi_* функции.

Однако это все равно будет блокировать выполнение до тех пор, пока не будет возвращен самый медленный запрос (и некоторое дополнительное время для анализа ответа).

Такие задачи должны выполняться в фоновом режиме, используя cronjobs или аналогичные альтернативы.

Кроме того, на github и co. Есть несколько библиотек, которые обертывают расширение curl для обеспечения более приятного API.

Концепция решает это: (процессор «исправить» от Ren @ php-docs)

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']));
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]