PHPプログラミングでは、 curl_multi_*関数は強力なマルチタスク同時処理機能を提供します。ただし、実際の開発中に、 curl_multi_close()を使用してcurl_setopt_array()と協力する場合、いくつかの一般的な問題に遭遇する可能性があります。今日は、これらの問題を分析してトラブルシューティングするお手伝いをします。
curl_multi_*関数は、複数の同時リクエストを実行するためのツールです。最も一般的に使用される関数には以下が含まれます。
curl_multi_init() :複数のCurlセッションを初期化します。
curl_multi_add_handle() :複数のCurlプロセッサにカールハンドルを追加します。
curl_multi_exec() :複数のCurl要求を実行します。
curl_multi_close() :複数のセッションを閉じます。
実際に使用すると、通常、 curl_setopt_array()で複数のオプションを設定しますが、例外が発生すると、配置の問題がより面倒になる可能性があります。
<?php
// 複数を初期化します cURL セッション
$multiHandle = curl_multi_init();
// 複数を作成します cURL ハンドル
$curlHandles = [];
for ($i = 0; $i < 3; $i++) {
$curlHandles[$i] = curl_init();
// 設定 cURL オプション
curl_setopt_array($curlHandles[$i], [
CURLOPT_URL => "https://gitbox.net/api/resource" . $i, // 交換する URL ドメイン名
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
]);
// 添加ハンドル到多重 cURL セッション中
curl_multi_add_handle($multiHandle, $curlHandles[$i]);
}
// どのくらいの実行 cURL 聞く
$running = null;
do {
curl_multi_exec($multiHandle, $running);
} while ($running);
// 获取聞く结果
foreach ($curlHandles as $handle) {
$response = curl_multi_getcontent($handle);
echo "Response: $response\n";
}
// 閉鎖 cURL ハンドル
foreach ($curlHandles as $handle) {
curl_multi_remove_handle($multiHandle, $handle);
curl_close($handle);
}
// 閉鎖多重 cURL セッション
curl_multi_close($multiHandle);
?>
リクエストが完了したとしても、 curl_multi_exec()がまだ終了せず、プログラムが実行を継続できない場合があります。この問題は通常、次の状況で発生します。
タイムアウトオプションは正しく設定されていません。リクエストがタイムアウトオプションを設定しない場合、またはタイムアウトが長すぎる場合、 curl_multi_exec()がここに閉じ込められ、終了できなくなる可能性があります。
curl_multi_remove_handle()またはcurl_close()は呼び出されません: curl_multi_exec()も、ハンドルが削除されて正しく閉じられていない場合、デッドループを入力する場合があります。
解決策: curl_multi_remove_handle()およびcurl_close()に電話して、処理が完了した後にリソースを正しくクリーンアップしてください。
curl_setopt_array()は、複数のオプションを一度に設定するために使用されますが、オプションの順序または無効なオプションのためにCurlの動作が異常である場合があります。特にcurl_multi_*の使用中、一般的な問題には以下が含まれます。
一貫性のないURL設定:異なるCurlハンドルが同じURL構成を使用する場合、要求間の競合が発生する可能性があります。
Option Overrideの問題: curl_setopt_array()が複数回呼び出されると、以前のオプションが上書きされ、一貫性のない構成が生じます。
解決策: curl_setopt_array()で渡されたすべてのオプションを確認して、それらが正しく、競合がないことを確認してください。たとえば、URLが正しく交換されているかどうかを確認します。
curl_multi_init()への各呼び出しの後、 curl_multi_close()は複数のセッションを閉じるために呼び出さなければなりません。 curl_multi_close()を呼び出すのを忘れた場合、これはメモリリークまたは過剰なファイル記述子の使用につながる可能性があり、それがパフォーマンスの問題につながります。
解決策:コードが終了したら、複数のCurlセッションを閉じるためにcurl_multi_close()が呼び出されていることを確認してください。
URLの設定を確認する:すべてのCurlハンドルに有効なURLがあることを確認してください。特に、 curl_setopt_array()で複数のオプションを設定する場合は、エラーまたは不作為を確認してください。
デバッグログ:カールデバッグ出力を有効にして、カールハンドルの詳細な実行プロセスを表示します。これにより、リクエストが正常に開始されたかどうか、または例外が発生した場所を見つけることができます。
タイムアウト構成:適切なタイムアウト時間を設定し、各リクエストにタイムアウト設定があることを確認します。リクエストが長すぎることを避け、プログラムは終了できません。
リソースのクリーンアップ: CURL_MULTI_REMOVE_HANDLE()およびCURL_CLOSE()への呼び出しを含む、各CURLハンドルは使用後に適切に閉じている必要があります。
メモリとファイルハンドル:PHPのメモリ制限とファイルハンドル制限を確認して、複数のカールセッションがリソースの漏れを引き起こさないようにします。
Curl_multi_*関数を合理的に使用することにより、複数の同時リクエストを効率的に処理できます。ただし、実際の開発では、詳細の問題は例外やパフォーマンスの問題に簡単につながる可能性があります。この記事で提供されるトラブルシューティングの手順が、一般的な問題を解決し、マルチタスクカール要求がスムーズに実行されることを保証することを願っています。