1

URL の配列 (~1000 個の URL) があり、それらが存在するかどうかをすべて確認したい。これが私の現在のコードです:

$south_east_png_endings = array();
for($x=1;$x<=25;$x++) {
    for($y=1;$y<=48;$y++) {
        $south_east_png_endings[] ="${x}s${y}e.png";
    }
}

foreach ($south_east_png_endings as $se){
    $url = 'http://imgs.xkcd.com/clickdrag/'.$se;
    $file_headers = @get_headers($url);
    if($file_headers[0] == 'HTTP/1.1 404 Not Found') {
        // echo 'Does not exist';
    }
    else
    {
        echo $url;
    }
}

このスクリプトは機能し、機能しているすべての URL をエコーアウトしますが、プロセスが長すぎます (完了するまでに数分かかります)。これをより速く行う方法はありますか、それともこれと同じくらい速くなりますか? たぶん、curl_timeout 関数を使用して時間を短縮できますか?

4

3 に答える 3

3

1) get_headers() は実際には GET リクエストを使用しますが、ファイルが存在するかどうかを知りたいだけの場合は必要ありません。代わりに HEAD を使用してください。マニュアルの例:

<?php
// By default get_headers uses a GET request to fetch the headers. If you
// want to send a HEAD request instead, you can do so using a stream context:
stream_context_set_default(
    array(
        'http' => array(
            'method' => 'HEAD'
        )
    )
);
$headers = get_headers('http://example.com');
?>

2) これらのチェックは簡単に並行して実行できるため、別々のスレッド/プロセスを使用してチェックを行う必要があります。ただし、自宅でこれを行っている場合、ルーターは一度に 1000 のリクエストで停止する可能性があるため、5 ~ 20 の同時スレッドなどを使用することをお勧めします。

于 2013-03-21T07:51:38.423 に答える
0

並列チェックには、multi_curlを使用できます。かなり速いかもしれません。ここにいくつかのがあります。@eis の例よりも複雑だからです。

PS また、curl ではメソッド HEAD でトリックを使用できます。

于 2013-03-21T08:20:39.417 に答える
0
function _isUrlexist($url) {
    $flag = false;
    if ($url) {
        $ch = curl_init();
        curl_setopt_array($ch, array(
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_NOBODY => true,
            CURLOPT_HEADER => true
            ));
        curl_exec($ch);
        $info = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        $flag = ($info == 200) ? true : false;
    }
    return $flag;
}
于 2016-07-08T11:26:01.033 に答える