マルチスレッドHTTPリクエストにlibcurlを使用する場合、 curl_share_init()関数を使用して共有ハンドル( curlsh * )を作成するためによく使用され、複数のcurlイージーハンドルがCookie、DNS、その他のリソースを共有できるようにします。 libcurl自体は非常に信頼性が高くなりますが、 curl_share_init()と関連するAPIを不適切に使用する場合、リソースの漏れやパフォーマンスの問題につながる可能性があります。したがって、Valgrindなどの動的な分析ツールで検出および最適化する必要があります。
Valgrindは、Linux環境でのC/C ++プログラムに適した強力なメモリデバッグ、メモリリーク検出、パフォーマンス分析ツールです。 FFIを使用して呼び出されるValgrindまたはLibcurlロジックを介してPHP拡張機能を実行すると、開発者が潜在的な問題を発見するのに役立ちます。
これは、Curlマルチスレッド共有ハンドルを使用した単純化されたPHP例です。
$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
$ch1 = curl_init();
curl_setopt($ch1, CURLOPT_URL, "https://m66.net/api/data1");
curl_setopt($ch1, CURLOPT_SHARE, $sh);
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, "https://m66.net/api/data2");
curl_setopt($ch2, CURLOPT_SHARE, $sh);
curl_exec($ch1);
curl_exec($ch2);
curl_close($ch1);
curl_close($ch2);
// このラインを無視すると、共有ハンドルリソースがリリースされません,メモリリークを引き起こします
curl_share_close($sh);
PHPまたはCラッパーの構築:ValgrindをPHPスクリプトに直接使用できないため、上記のロジックをC拡張機能にラップするか、 FFIを介してPHPにlibcurlコールを統合できます。
コマンドを実行します。
valgrind --leak-check=full --track-origins=yes php your_script.php
出力分析:
Valgrindは次の情報を促します。
==12345== 48 bytes in 1 blocks are definitely lost in loss record 1 of 10
==12345== at 0x4C2FB55: calloc (vg_replace_malloc.c:711)
==12345== by 0x5B05A3: curl_share_init (share.c:144)
==12345== by 0x10927B: zif_curl_share_init (php_curl.c:2100)
...
上記の出力は、curl_share_init()への呼び出し後に割り当てられたメモリがcurl_share_close()を介して正しくリリースされていないことを示しています。
メモリリークに加えて、ValgrindはCallGrindツールを使用して関数呼び出し頻度と時間のかかる分析を実行することもできます。
valgrind --tool=callgrind php your_script.php
次に、 kcachegrindを使用してグラフィカル分析に使用します。これにより、どのlibcurl関数が頻繁に呼び出され、どのリソースがロック競合を引き起こすかを明確にすることができます。
共有ハンドルを使用してから、常にcurl_share_close()を呼び出します。
特に高い並行性環境では、不必要なデータ共有を避け、DNSまたはCookieの共有はボトルネックになる可能性があります。
特にPHP Long-Lifeサイクルスクリプトで、共有ハンドルの使用ライフサイクルの統一された管理。
オンラインに行く前に、特にC拡張またはFFIコールが含まれる場合は、オンラインになる前に、Valgrindを介してメモリチェックを行います。
Valgrindの正確な検出により、 curl_share_init()を使用すると、隠されたメモリリークとパフォーマンスのボトルネックがないことを確認できます。 PHPでの同時HTTP要求を効率的に処理する必要がある開発者の場合、このツールチェーンをマスターすることが非常に必要です。優れたリソース管理慣行でValgrindを使用すると、システムの安定性と保守性が大幅に向上する可能性があります。