多数のAPIリクエストを必要とするPHP CLIスクリプトを作成するとき、リソースの合理的な管理とパフォーマンスの改善は、開発者が無視できない問題になりました。特に、複数のHTTP要求が同時に処理するために必要なシナリオでは、 curl_share_init()などのcurlが提供するいくつかの高度な関数は、接続を再利用してリソースをある程度共有し、それによって全体的な実行効率を改善するのに役立ちます。この記事では、CLIスクリプトでcurl_share_init()を使用して複数のリクエストを管理する方法について潜ります。
curl_share_init()は、共有ハンドルを初期化するためにPHPによって提供されるCurl関数です。このハンドルを使用すると、複数のカールセッション間でDNSキャッシュ、SSLセッション、Cookie、その他のリソースを共有できます。
curlshopt_share :
curl_lock_data_cookie :Cookieデータを共有します。
curl_lock_data_dns :共有DNSキャッシュ。
curl_lock_data_ssl_session :SSLセッションを共有します。
これらの共有オプションは、高頻度で同じホストまたはドメイン名のインターフェイスを要求する場合に特に役立ちます。
複数の同時リクエストAPIをシミュレートし、 curl_share_init()を使用してパフォーマンスを改善する実際のPHP CLIスクリプトの例を見てみましょう。
<?php
$urls = [
"https://m66.net/api/endpoint1",
"https://m66.net/api/endpoint2",
"https://m66.net/api/endpoint3",
"https://m66.net/api/endpoint4"
];
// 共有ハンドルを初期化します
$sh = curl_share_init();
// 共有タイプを設定します
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION);
$multiHandle = curl_multi_init();
$curlHandles = [];
foreach ($urls as $url) {
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SHARE => $sh,
CURLOPT_USERAGENT => "PHP-Curl-Client"
]);
curl_multi_add_handle($multiHandle, $ch);
$curlHandles[] = $ch;
}
// マルチスレッドリクエストを実行します
$active = null;
do {
$mrc = curl_multi_exec($multiHandle, $active);
curl_multi_select($multiHandle);
} while ($active > 0);
// 処理結果
foreach ($curlHandles as $ch) {
$response = curl_multi_getcontent($ch);
$info = curl_getinfo($ch);
echo "URL: " . $info['url'] . "\n";
echo "HTTP Code: " . $info['http_code'] . "\n";
echo "Response: " . substr($response, 0, 100) . "...\n\n";
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch);
}
// リソースをクリーンアップします
curl_share_close($sh);
curl_multi_close($multiHandle);
curl_share_init()を使用することの利点は、次の側面で特に明白です。
DNSキャッシュの再利用<br> 要求するたびにドメイン名の再解凍を避け、DNSクエリ時間を節約してください。
SSLセッション多重化<br> HTTPSリクエストの場合、多重化SSLセッションは握手の遅延を大幅に減らすことができます。
クッキー共有<br> ログインステータス、追跡情報などを複数のリクエストで共有して、リクエストの一貫性と有効性を改善します。
メモリ使用量の最適化<br> 複数の接続がいくつかのリソースを共有しているため、メモリオーバーヘッドを効果的に削減できます。
curl_share_init()は強力ですが、すべてのシナリオが使用に適しているわけではありません。推奨される典型的なシナリオは次のとおりです。
バルクは、同じドメイン名の下で複数のインターフェイスを要求します。
高周波インターフェイスの同期は、CLIツールで実行されます。
クローラー、データ収集などのバックエンドサービススクリプト。
Web環境(FPMモードなど)では、リソースを同時プロセス間で安全に共有できないため、共有ハンドルを使用することはお勧めしません。これは、競合やエラーにつながる可能性があります。
CURL_SHARE_INIT()を合理的に使用することにより、PHP CLIスクリプトはマルチレクエストタスクをより効率的に管理できます。これにより、実行速度が向上するだけでなく、システムリソースも節約できます。これは、外部APIとの頻繁な通信を必要とするCLIツールの貴重な最適化方法です。これらの高度なCurlテクノロジーを習得して適用すると、高性能PHPスクリプトを構築する際の競争力が大幅に向上します。