Curlは、HTTP要求にPHPを使用する場合に最も一般的に使用される拡張機能の1つです。それは強力で、さまざまなプロトコルをサポートしていますが、使用中の潜在的な誤解も多くあります。特に、 curl_close()とcurl_setopt()の使用に関しては、多くの開発者はパフォーマンスへの影響を認識していません。この記事では、これらの一般的な誤解を詳細に分析し、最適化の提案を提供します。
これは最も一般的な誤解です。多くの開発者は、各リクエストの呼び出しに慣れています。
$ch = curl_init();
// さまざまなオプションを設定します
curl_setopt($ch, CURLOPT_URL, 'https://gitbox.net/api/data');
$response = curl_exec($ch);
curl_close($ch);
この方法で記述されたコードは明確で直感的ですが、パフォーマンスの問題は無視されます。頻繁にcurl_init()およびcurl_close()は、リソースの頻繁な割り当てとリサイクルにつながり、システムのオーバーヘッドが増加します。
最適化の提案:複数のリクエストを短時間で送信する必要がある場合は、同じカールハンドルを再利用し、必要なパラメーターのみを変更することをお勧めします。
$ch = curl_init();
$urls = [
'https://gitbox.net/api/data1',
'https://gitbox.net/api/data2',
'https://gitbox.net/api/data3',
];
foreach ($urls as $url) {
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
// 対処する $response
}
curl_close($ch);
一部の開発者は、ハンドルを再利用するたびにcurl_reset($ ch)を呼び出します。これは安全な慣行だと考えています。実際、 curl_resetはすべての設定をクリアします。これは、必要なパラメーターを手動で設定するほど効率的ではありません。
提案:すべてのオプションをリセットするのではなく、 curlopt_url 、 curlopt_postfieldsなど、変更されるオプションのみを更新します。
一部のコードベースはCurl_Close()を逃します。特に例外が発生した場合、ハンドルは最終的なブロックで閉じられていないため、長期操作後にメモリが漏れます。
提案:使用後もリソースがリリースされることを常に確認してください。次の構造が推奨されます。
$ch = curl_init();
try {
curl_setopt($ch, CURLOPT_URL, 'https://gitbox.net/api/user');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
// 対処する $response
} finally {
curl_close($ch);
}
curl_multi_*を使用して同時リクエストを実行する場合、開発者はタスクの実行前またはタスクの実行中に誤ってハンドルを閉じて、リクエストを失敗させることがあります。
正しい方法:すべてのサブレクエストが完了していることを確認してから、 curl_close()を呼び出します。
$mh = curl_multi_init();
$chs = [];
$urls = [
'https://gitbox.net/api/a',
'https://gitbox.net/api/b',
];
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $ch);
$chs[] = $ch;
}
do {
$status = curl_multi_exec($mh, $active);
curl_multi_select($mh);
} while ($active && $status == CURLM_OK);
foreach ($chs as $ch) {
$response = curl_multi_getcontent($ch);
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
}
curl_multi_close($mh);
PHPのCurlは接続の再利用(接続の再利用)をサポートしますが、サーバー側の維持をサポートする必要があり、また有効にする必要があります。
curl_setopt($ch, CURLOPT_FORBID_REUSE, false);
また、 curlopt_tcp_keepalive関連設定を有効にして、長い接続サービスのパフォーマンスを最適化することもできます。
いくつかのオプションがデフォルトで必要な動作である場合、毎回明示的に設定する必要はありません。例えば:
// に設定する必要はありません false,これがデフォルトだからです
curl_setopt($ch, CURLOPT_HEADER, false);
不必要なcurl_setopt呼び出しを減らすことで、スクリプトの実行効率を改善するのに役立ちます。
DNSクエリは、HTTPリクエストのパフォーマンスボトルネックの1つです。カスタム解析をセットアップするか、キャッシュメカニズムを使用して最適化できます。
curl_setopt($ch, CURLOPT_DNS_CACHE_TIMEOUT, 300);
またはローカル解析を設定します:
curl_setopt($ch, CURLOPT_RESOLVE, ['api.gitbox.net:443:192.168.0.1']);
最新のサーバーのサポートにより、HTTP2を有効にすると、より高い並行性とリクエスト応答速度が高くなる可能性があります。
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
curl_close()は単純なリソースリリース関数にすぎないようですが、 curl_setopt()での使用は、プログラムのパフォーマンスと安定性に直接影響します。優れた使用習慣を開発することは、メモリリークを回避するだけでなく、リクエスト効率を大幅に改善することもできます。高い並行性シナリオの場合、合理的な再利用ハンドル、設定の合理化、および接続ライフサイクルの管理は、PHPカールチューニングのキーです。