PHP開発では、Restfulインターフェイスへの頻繁な呼び出しは非常に一般的なシナリオです。特にマイクロサービスアーキテクチャでは、さまざまなサービス間の通信がHTTP要求に依存することがよくあります。 Curlは、HTTP要求を処理するためにPHPで最も一般的に使用される拡張機能です。通常、単一のリクエストのパフォーマンスオーバーヘッドは許容されますが、高い並行性シナリオでは、各リクエストが接続リソースを繰り返し初期化する場合、かなりのパフォーマンスボトルネックを引き起こします。
この時点で、 curl_share_init()関数は便利です。複数のCurlハンドルがDNSキャッシュ、SSLセッションなどの情報を共有できるようにするリソース共有メカニズムを提供し、それにより接続確立の時間を短縮し、インターフェイス要求全体の効率を改善します。
curl_share_init()は、Curlが提供するリソース共有初期化関数であり、Curl Shareハンドルを返します。このハンドルを使用すると、特定のリソースを共有するように複数のCurlリクエストを構成できます。たとえば
DNSキャッシュ( curlshopt_shareおよびcurl_lock_data_dns )
Cookie( curlshopt_share and curl_lock_data_cookie )
SSLセッション( curlshopt_share and curl_lock_data_ssl_session )
これらの共有データは、リクエストごとに繰り返し計算とハンドシェイクを大幅に削減できます。
たとえば、複数のサービスインターフェイスを同時に要求する必要があるとします。
https://api.m66.net/service1
https://api.m66.net/service2
https://api.m66.net/service3
CURL_SHARE_INIT()を使用した完全なPHP例を次に示し、リソース共有を実装します。
<?php
// 共有ハンドルを初期化します
$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION);
// 要求する URL 配列
$urls = [
'https://api.m66.net/service1',
'https://api.m66.net/service2',
'https://api.m66.net/service3',
];
// 初期化 curl_multi ハンドル
$mh = curl_multi_init();
$handles = [];
foreach ($urls as $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SHARE, $sh); // 共有リソースをセットアップします
curl_multi_add_handle($mh, $ch);
$handles[] = $ch;
}
// 同時リクエストを実行します
$running = null;
do {
curl_multi_exec($mh, $running);
curl_multi_select($mh);
} while ($running > 0);
// 結果を取得します
foreach ($handles as $ch) {
$response = curl_multi_getcontent($ch);
echo "Response: " . $response . "\n";
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
}
// リソースをクリーンアップします
curl_share_close($sh);
curl_multi_close($mh);
?>
curl_share_init()を使用する利点は、主に次の側面に反映されています。
DNSキャッシュ共有:各要求のドメイン名の繰り返し解像度を避けます。特に、複数のリクエストが同じドメイン名にアクセスする場合、利点は明らかです。
SSLセッションの再利用:SSLハンドシェイクオーバーヘッドを削減します。特に、HTTPSインターフェイスコールが頻繁に発生するシナリオでCPUリソースを保存します。
改善された接続効率:HTTP Keep-Aliveで使用すると、インターフェイスリクエスト効率を大幅に改善できます。
複数のインターフェイスが頻繁に呼び出される高い並行性環境またはアプリケーションシナリオでは、 CURL_SHARE_INIT()の合理的な使用は、システムの全体的なパフォーマンスと応答速度を大幅に改善できます。
すべてのリソースが共有に適しているわけではありません。特にCookieは、セキュリティや州の汚染の問題を引き起こす可能性があります。
共有リソースは、共有リソースで使用されているすべてのカールハンドルが閉じられた後、閉じている必要があります。
すべてのPHPインストールがCurlの共有サポートを有効にしているわけではなく、 Curl_version()を使用してサポートステータスを確認できます。