重複の可能性:
PHP での非同期 HTTP リクエスト
foreach ループを使用し、ファイルからアイテム ID を取得し、ステータスが 200 の場合にヘッド リクエストをチェックするスクリプトがあります。このスクリプトの実行には時間がかかるので、何か方法はありますか?一度に複数のリクエスト?$.ajax() で for ループを実行すると、ajax で一度にすべてが開始されることがわかります。どうすればphpでこの動作を取得できますか、またはバッチ処理を許可する代替手段はありますか?
重複の可能性:
PHP での非同期 HTTP リクエスト
foreach ループを使用し、ファイルからアイテム ID を取得し、ステータスが 200 の場合にヘッド リクエストをチェックするスクリプトがあります。このスクリプトの実行には時間がかかるので、何か方法はありますか?一度に複数のリクエスト?$.ajax() で for ループを実行すると、ajax で一度にすべてが開始されることがわかります。どうすればphpでこの動作を取得できますか、またはバッチ処理を許可する代替手段はありますか?
関数を使用curl_multi_*
します。http://www.php.net/manual/en/function.curl-multi-exec.phpを参照してください。
気をつけて!時間がかかることがわかっている場合は、おそらく数百または数千の URL をリクエストすることになります。ターゲット サーバーを圧倒しないように注意してください。
また、ターゲットで実行されているコードによっては、リクエストに対して実行する必要がある作業の量が、HEAD
リクエストの場合とまったく同じになる場合があることにも注意してGET
ください。したがって、唯一の最適化は、データを転送しないことです。これは、サービス拒否攻撃と誤解される可能性があります。
単一のリクエストは簡単です (ご指摘のとおり)。ループして Pear ライブラリ HTTP_Request2 を使用し、HEAD リクエストを作成します。
$request = new HTTP_Request2('http://www.your_url.com/',
HTTP_Request2::METHOD_HEAD);
$response = $request->send();
if (200 == $response->getStatus()) {
echo "Yippie... a 200";
}
php curl ライブラリを使用することもできますが、対処するのははるかに手間がかかります: curl による php でのヘッダーのみの取得
ただし、PHP だけで並行して実行するには、exec() のようなものを使用して他の php スクリプトをフォークする必要があります。これは、PHP がスレッド化されたプログラミングや同時実行をネイティブにサポートしていないためです。同様に、gearman などを使用してある種のカスタム ジョブ/ワーカー キューを使用することもできますが、それはかなり複雑です。