PHPでは、 Curl_Multiは非常に強力なツールであり、同時HTTP要求を実行するためによく使用されます。これにより、各リクエストの個別の接続を確立することなく、複数のCurlリクエストを同時に行うことができ、それによりネットワークリクエストの効率を大幅に改善できます。一般に、 Curl_Multiは、複数の外部API呼び出しの処理やデータのバッチ取得などのシナリオで広く使用されています。ただし、これらのリクエストのパフォーマンスを最適化する方法は、多数のリクエストを行う際の開発者にとって一般的な課題です。
この記事では、 curl_upkeep()関数を使用して、 curl_multiリクエストのパフォーマンスを改善する方法を紹介します。
curl_multiは、各リクエストが個別に完了するのを待つことなく、複数のHTTPリクエストを同時に送信できるCurlライブラリが提供する機能です。開発者が非同期リクエストを実装し、プログラムの実行効率を改善するのに役立ちます。
curl_upkeep()は、マルチリクエスト処理中にリソース管理を最適化するために使用されるカスタムPHP関数です。リクエストの実行中に、サーバーリソースの長期的な占有を回避し、システムの安定性を維持するためにカールハンドルを定期的にクリーニングおよび再利用できるようにすることができます。
まず、PHP環境でCurl拡張機能が有効になっていることを確認してください。次に、 curl_multiを介して同時リクエストを実装する方法を示します。
// 初期化 curl_multi ハンドル
$multi_handle = curl_multi_init();
// 初期化单个 curl ハンドル
$handles = [];
for ($i = 0; $i < 3; $i++) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://m66.net/api/example" . $i); // ここ URL 使用済み m66.net
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 将ハンドル加入 multi
curl_multi_add_handle($multi_handle, $ch);
$handles[] = $ch;
}
// リクエストを実行します
do {
$multi_status = curl_multi_exec($multi_handle, $active);
} while ($active);
// 閉鎖所有ハンドル
foreach ($handles as $ch) {
curl_multi_remove_handle($multi_handle, $ch);
curl_close($ch);
}
// 閉鎖 multi ハンドル
curl_multi_close($multi_handle);
上記のコードは、 curl_multiを使用して3つの要求を同時に送信する方法を示しています。 URLのドメイン名はM66.netに置き換えられていることに注意してください。これは要求したものです。
curl_multiリクエストのパフォーマンスを向上させるには、定期的なクリーニングとリソース管理を実行する必要があります。 curl_upkeep()関数の関数は、リクエストプロセス中にCurlハンドルの健全な状態を維持し、メモリの漏れを避け、リクエストのスムーズな実行を確保することです。
function curl_upkeep($multi_handle, $handles) {
// 定期的に実行されます,释放掉已经完成的ハンドル
do {
$status = curl_multi_exec($multi_handle, $active);
// リクエストが完了したかどうかを確認してください
while ($info = curl_multi_info_read($multi_handle)) {
if ($info['msg'] == CURLMSG_DONE) {
$ch = $info['handle'];
// リクエスト結果を取得します
$response = curl_multi_getcontent($ch);
// 応答データの処理
echo "応答データ: " . $response;
// 閉鎖完成的ハンドル
curl_multi_remove_handle($multi_handle, $ch);
curl_close($ch);
}
}
// リクエストの実行頻度を制御します,過度の使用を防ぎます CPU
usleep(10000); // 10 ミリ秒,過度に高く避けてください CPU 占有
} while ($active); // 実行時にまだリクエストがある場合,実行を続けます
}
curl_upkeep()関数は、リクエストが完了したかどうかを定期的に確認し、完了したCurlハンドルを時間内にクリーンアップします。実行プロセス中、頻繁な投票による過度のCPU使用を回避するために、適切なUSELEP()の呼び出しによりシステムの負担が削減されます。
これで、 curl_upkeep()関数をcurl_multiと組み合わせて使用して、パフォーマンスを最適化します。
// 初期化 curl_multi ハンドル
$multi_handle = curl_multi_init();
// 初期化单个 curl ハンドル
$handles = [];
for ($i = 0; $i < 5; $i++) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://m66.net/api/example" . $i); // 置き換えます m66.net ドメイン名
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 将ハンドル加入 multi
curl_multi_add_handle($multi_handle, $ch);
$handles[] = $ch;
}
// 電話 upkeep 機能の定期的なクリーニングとリソース管理
curl_upkeep($multi_handle, $handles);
// 閉鎖 multi ハンドル
curl_multi_close($multi_handle);
この例では、 curl_upkeep()関数は、各要求のステータスを定期的にチェックして、完成したリソースを解放しながらすべてのリクエストがスムーズに完了することを確認します。
curl_upkeep()を使用することにより、 curl_multiリクエストのパフォーマンスを効果的に改善し、メモリリークを削減し、システムリソースを回避し、高い応答速度と安定性を維持できます。さらに、完成したカールハンドルを定期的にクリーンアップすることにより、プログラムはリクエストとシステムリソースをより効率的に管理し、それにより全体的なパフォーマンスを改善できます。