Curlは、サーバーとデータを交換するためのツールです。 HTTP、HTTP、FTPなどを含むさまざまなプロトコルをサポートします。PHPのCurl拡張機能は、リクエストを簡単に開始し、応答を受け取り、関連するエラーを処理できる簡単なインターフェイスを提供します。
複数のHTTPリクエストを作成する場合、 CURLのリソースは制限されるため、これらのリソースはリクエストが完了した後に時間内にリリースする必要があります。これは、curl_close()関数を呼び出すことによって達成されます。 HTTP要求が接続を閉じることなくループで頻繁に開始されると、メモリリークやサーバーのパフォーマンスの低下になります。
Curlリクエストを行うとき、通常、次の手順に従います。
カールセッションを初期化します。
リクエストパラメーターを設定します。
リクエストを実行して応答を取得します。
カールセッションを閉じます。
$ch = curl_init(); // 初期化 cURL セッション
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/some-endpoint"); // リクエストを設定します URL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 応答コンテンツを取得します
$response = curl_exec($ch); // リクエストを実行します
curl_close($ch); // 关闭セッション
リクエストがループで頻繁に開始されると、各リクエストはメモリを割り当てて接続情報を保存します。ループの各反復中にCURLセッションが時間内に閉じられない場合、メモリリークが発生します。そうすることで、PHPスクリプトがあまりにも多くのメモリを消費する可能性があり、最終的にパフォーマンスの問題につながり、サーバーでクラッシュすることさえあります。
たとえば、カールセッションを適切に閉じることなく、ループでリクエストが蓄積し、ますます多くのメモリを消費します。
// エラーデモンストレーション:ループが閉じていません cURL セッション
for ($i = 0; $i < 1000; $i++) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/some-endpoint");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
// 電話するのを忘れました curl_close()
}
メモリリークを回避するには、各リクエストが終了した後にcurl_close()関数が呼び出されることを確認する必要があります。最も簡単な方法は、各リクエストが完了した後にリソースが解放されるように、 curl_close()をループ内に配置することです。
// 正しいデモンストレーション:ループで閉じます cURL セッション
for ($i = 0; $i < 1000; $i++) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/some-endpoint");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
curl_close($ch); // 及时关闭セッション
}
各リクエストが完了した後にカールセッションを閉じることにより、PHPメモリが無駄にならず、各HTTP要求のリソースが時間内にリリースされることを確認してください。
多数のリクエストを処理する場合、シングルスレッドループは非常に遅くなる可能性があります。多数のリクエストを処理する必要があり、実行効率を改善する必要がある場合は、マルチスレッドカール(同時カールとも呼ばれます)の使用を検討できます。これにより、リクエストの時間を大幅に短縮し、頻繁なI/O操作によって引き起こされるボトルネックを回避できます。
// マルチスレッドの使用 cURL パフォーマンスを最適化するため
$mh = curl_multi_init(); // 初期化 cURL 多线程セッション
$handles = [];
for ($i = 0; $i < 1000; $i++) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/some-endpoint");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_multi_add_handle($mh, $ch); // それぞれを置きます cURL 句柄添加到多线程セッション中
$handles[] = $ch;
}
// マルチスレッドリクエストを実行します
$active = null;
do {
$mrc = curl_multi_exec($mh, $active);
} while ($active > 0);
// すべてを閉じます cURL セッション
foreach ($handles as $ch) {
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
}
curl_multi_close($mh); // 关闭多线程セッション
これにより、メインプログラムをブロックすることなく、1つのプロセスで複数のリクエストを並行して処理できるため、パフォーマンスが大幅に向上します。