関数を使用して、同時に複数の 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']));