PHPでは、 Curlは強力なライブラリであり、HTTP、HTTPS、FTPなどの複数のプロトコルを介してリクエストを送信できます。Curl_Multi_ *シリーズの関数により、複数の非同期リクエストを同時に発行することができ、パフォーマンスを改善し、リクエストを削減できます。非同期リクエストは、特に複数のHTTP要求が必要な場合に非常に便利です。
ただし、非同期リクエストにcurl_multi_*関数を使用する場合、一般的な落とし穴があります。接続を繰り返し閉じます。 Curl_multi_close関数を介してCurlセッションを閉じると、接続が適切に管理されていない場合、一部の接続が適切に閉じられない前に繰り返し閉じて、エラーまたはメモリリークが発生します。
この記事では、PHPでcurl_multi_closeを使用して非同期リクエストを管理し、接続の繰り返し閉鎖を避ける方法を示します。
まず、PHPのcurl_multi_*シリーズ関数を使用して、複数の非同期リクエストを開始する方法を見てみましょう。これが基本的な例です。
<?php
// 複数を作成します cURL セッション
$ch1 = curl_init();
$ch2 = curl_init();
// 設定 cURL リクエストオプション
curl_setopt($ch1, CURLOPT_URL, 'https://gitbox.net/api/endpoint1');
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_URL, 'https://gitbox.net/api/endpoint2');
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
// 作成する cURL 複数のハンドル
$mh = curl_multi_init();
// それぞれを置きます cURL セッション加入複数のハンドル
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
// 非同期リクエストを実行します
do {
$status = curl_multi_exec($mh, $active);
} while ($active);
// 各リクエストの結果を取得します
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);
// 出力結果
echo "Response 1: " . $response1 . "\n";
echo "Response 2: " . $response2 . "\n";
// 关闭セッション
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
curl_close($ch1);
curl_close($ch2);
?>
この例では、2つのCurlセッションを作成してリクエストURLを設定し、 Curl_multi_*関数を使用して2つの非同期リクエストを同時に発行します。 curl_multi_execは、すべてのリクエストが完了するまで実行されます。次に、 curl_multi_getContentを使用して返品結果を取得し、最終的にすべてのセッションを閉じます。
上記のコードでは、 curl_multi_closeを使用してcurlマルチハンドルを閉じ、 curl_closeを使用して個々のCurlセッションを閉じました。これは一般的な慣行ですが、 curl_multi_closeは複数のハンドルの閉鎖のみを担当し、各セッションハンドルを閉じないことに注意する必要があります。したがって、 curl_multi_closeを閉じた後、各curl_closeはcurl_closeを介して閉じる必要があります。
問題: curl_closeまたはcurl_multi_closeを繰り返し呼び出すと、接続が繰り返される問題がある場合があります。これを避けるために、2つの方法をとることができます。
各ハンドルが一度だけ閉じていることを確認してください<br> ループまたは処理中、誤って特定のセッションを繰り返し閉鎖する場合があります。この問題を回避するために、閉じるときにマークを付けることができ、各ハンドルが一度だけ閉じていることを確認できます。
最初にハンドルを取り外してから閉じます<br> curl_multi_remove_handleを使用してハンドルを取り外し、閉じたときに各ハンドルが複数のハンドルから削除されるようにします。これにより、 curl_multi_closeが呼び出されたときに閉じたハンドルが表示されません。
接続の繰り返しの閉鎖を避けるために、コードを改善しました。
<?php
// 複数を作成します cURL セッション
$ch1 = curl_init();
$ch2 = curl_init();
// 設定 cURL リクエストオプション
curl_setopt($ch1, CURLOPT_URL, 'https://gitbox.net/api/endpoint1');
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_URL, 'https://gitbox.net/api/endpoint2');
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
// 作成する cURL 複数のハンドル
$mh = curl_multi_init();
// それぞれを置きます cURL セッション加入複数のハンドル
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
// 非同期リクエストを実行します
do {
$status = curl_multi_exec($mh, $active);
} while ($active);
// 各リクエストの結果を取得します
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);
// 出力結果
echo "Response 1: " . $response1 . "\n";
echo "Response 2: " . $response2 . "\n";
// 移除句柄后再关闭セッション
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
// 正しく閉じます
curl_multi_close($mh);
curl_close($ch1);
curl_close($ch2);
?>
curl_multi_*関数を使用して、複数の非同期リクエストを効果的に開始してパフォーマンスを向上させます。
Curlセッションを閉じるときは、 curl_multi_remove_handleを使用してセッションを削除してから、 curl_multi_closeに電話してください。
各Curlセッションは、閉じる前にcurl_closeで閉じる必要があり、 curl_multi_closeで繰り返し閉じることを避けます。
接続の閉鎖を正しく管理することにより、接続の繰り返し閉鎖を回避し、コードがより安定して効率的であることを保証できます。