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

0

Мне интересно узнать, что является лучшим/самым простым способом проверки URL-адресов для кодов ответа сервера, таких как 404s. В настоящее время я использую что-то очень похожее на то, что можно найти в комментариях руководства 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-расширение?
  • 0
    Мне стыдно признаться, что это год, и я избежал продления завитков на сегодняшний день (в порядке предположения) ...
Теги:
url
http-status-code-404

1 ответ

0

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

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

Задачи, подобные этому, должны выполняться в фоновом режиме с использованием cronjobs или simliar альтернатив.

Кроме того, на 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']));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню