同時リクエストを処理する場合、特に同時データクロールまたはAPI呼び出しがPHPで使用されるシナリオでは、リソースの重複した負荷と接続の確立のコストは無視できません。 curl_share_init関数は、libcurlが提供する高度な機能です。複数のカールセッションがDNSキャッシュ、SSLセッション、Cookieなどの特定のリソースを共有できるため、マルチスレッド環境でのパフォーマンスが向上します。
この記事では、PHPでcurl_share_initを使用してCurlリソース共有を実装する方法を紹介し、例と組み合わせて使用する方法を説明します。
curl_share_initは、共有ハンドル( Curl Shareハンドル)を初期化するためにLibcurlが提供する関数です。このハンドルは、複数のCurl要求とデータを共有することができ、繰り返しの初期化、解析、または交渉プロセスを回避できます。
マルチスレッドまたはマルチプロセスクローラーの使用など、高い同時リクエストシナリオ。
同じホストにアクセスし、DNSキャッシュを共有する必要がある複数のリクエスト。
同じCookieまたはSSLセッションを使用した複数のリクエスト。
PHPでは、 curl_share_init() 、 curl_share_setopt() 、 curl_setopt()などの関数を使用して、共有リソースを実装できます。これが完全な例です。
<?php
// 共有ハンドルを初期化します
$sh = curl_share_init();
// 共有オプションを設定します,ここで共有します Cookie そして DNS
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
// 複数を作成します cURL セッション
$urls = [
'https://m66.net/api/data1',
'https://m66.net/api/data2',
];
$chs = [];
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 共有ハンドルをバインドします
curl_setopt($ch, CURLOPT_SHARE, $sh);
$chs[] = $ch;
}
// 初期化 multi handle
$mh = curl_multi_init();
// すべてのリクエストを追加します multi handle
foreach ($chs as $ch) {
curl_multi_add_handle($mh, $ch);
}
// すべてのリクエストを実行します
$running = null;
do {
curl_multi_exec($mh, $running);
curl_multi_select($mh);
} while ($running > 0);
// 結果を取得します
foreach ($chs as $ch) {
$content = curl_multi_getcontent($ch);
echo "応答コンテンツ:\n" . $content . "\n\n";
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
}
// 掃除
curl_share_close($sh);
curl_multi_close($mh);
?>
共有ロックタイプの制限:一度に1つのロックタイプのみを設定できます( curl_lock_data_cookieやcurl_lock_data_dnsなど)。 curl_share_setoptは、複数のタイプを設定するときに複数回呼び出す必要があります。
スレッドの安全性の問題:Curl_shareはC言語のマルチスレッドシナリオで使用されていますが、PHP自体はスレッドセーフではないため、この関数は主に同時性のリソース最適化( curl_multi_*など)をシミュレートするために使用されます。
エラー処理:実際の開発では、 curl_errnoおよびcurl_errorチェックを追加して、リクエストが正常に実行されることを確認する必要があります。
curl_share_initは、マルチリクエストシナリオでパフォーマンスを大幅に最適化できる強力なツールです。複数のカール要求間でリソースを共有することにより、ネットワーク要求のオーバーヘッドを削減するだけでなく、システムの全体的な効率を向上させます。 PHPのcurl_multiと組み合わせて、高性能の同時システムのための強固な基盤を築くことができます。
サードパーティのインターフェイスに接続するか、効率的なクローラーシステムを構築する必要がある場合は、 curl_shareによってもたらされる最適化効果を試すこともできます。