0

404 などのサーバー応答コードについて URL をテストするための最良/最も無駄のない方法を知りたいと思っています。私は現在、get_headers の php マニュアルのコメントにあるものと非常によく似たものを使用しています。

<?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のレスポンスコードをまとめてチェックできる方法はないだろうか。

4

1 に答える 1

0

関数を使用して、同時に複数の curl リクエストを実行できcurl_multi_*ます。

ただし、これは、最も遅いリクエストが返されるまで実行をブロックします (およびレスポンスの解析のための追加の時間)。

このようなタスクは、cronjobs または同様の代替手段を使用してバックグラウンドで実行する必要があります。

さらに、github および co. には複数のライブラリがあり、curl 拡張機能をラップしてより優れた API を提供します。

概念は次のように解決されます: ( cpu "fix" by 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']));
于 2014-12-08T17:36:25.177 に答える