php-cp (php-connect-pool) は、PHP 拡張機能で書かれたデータベース接続プールです。
PHP は開発が速く、起業家としての迅速な反復に適していることはわかっていますが、トラフィックが増加すると、PHP の多数の短い接続により DB 層が不必要に消費され、PHP のリクエスト処理プロセス中に接続が保持されます。ユーザー間で TCP 接続を共有できないことが原因で、接続数が増加すると MySQL のパフォーマンスが急激に低下するため、多くの大企業は Java への切り替えを余儀なくされます。それは、PHP には接続プールがないということです。もちろん、オープンソース データベース ミドルウェアを使用してこの問題を軽減することもできますが、このプロジェクトには既存のオープンソース製品とは次のような違いがあります。
1. アプリケーション サーバー上で実行されるプロキシ プロセスなので、外部依存関係の層が軽減されます。 、これにより、アーキテクチャがよりシンプルになり、すっきりし、信頼性が高くなります。
2. パフォーマンスが向上し、効率的な ipc を通じて php プロセスと通信し、プロトコル解析の消費を回避します。
3. Redis と mysql を同時にサポートし、2 つの別々のミドルウェア システムを展開する必要はありません。
1. 接続の最大数と最小数の構成をサポートします。
2. 低圧による自動回復接続をサポートします (強度と頻度は設定可能です)。
3.スムーズな再起動をサポートします。
4. 接続枯渇のキューイングメカニズムをサポートします。
5. mysql と redis の両方をサポートします。
6. フレームワークを簡単に統合した後 (新しいメソッドを変更する)、既存のビジネスはコードを 1 行も変更することなく接続プールを使用できます。
7. 使用できないダウンタイム IP のリストを取得する get_disable_list 関数を提供します。これにより、クライアント上でロード バランシングも実行できます (構成ファイル内のすべての IP とダウンタイム IP を区別し、ランダム化します)。
ところで: lvs を使用することもできますが、lvs 転送ではシステム アーキテクチャへの依存関係が生じ、バックエンド データベースに問題がある場合は拡張が制限されます。レベル。
8. 接続プール プロセスは、ダウンタイム リストを監視するために開始されます。可能な場合は、get_disable_list 関数の戻り値に反映されます。9.接続プールプロセスによって転送されるため、基本的に QPS の損失はありません。
4. 使用します
2. エージェントプロセスを開始します
./pool_server start
「start」「stop」「restart」「reload」コマンドをサポートします
3. PHP スクリプトを変更します
$db = new PDO(xxxxx);
$db = new pdo_connect_pool(xxxx);//persistent を使用しないでください
$redis = new Redis();
$redis = new redis_connect_pool();//pconnect を使用しないでください
ヒント: $ を呼び出しますdb できるだけ早く /$redis->release() して、このプロセスによって占有されている接続をプールに解放します;
五.API
get_disable_list($redis_conf,CP_DEFAULT_REDIS_PORT) ;
- 最初のパラメータは設定ファイルです
- 設定ファイルが変更されると、使用できないリストがクリアされます
6. ストレス テスト:
1。プール:
$obj = new pdo_connect_pool('mysql:host=192.168.20.130;dbname=test1',"admin","admin");
$stmt = $obj- >query("show tables");
$data = $stmt->fetchAll();
var_dump($data);
$obj->release();
完了したリクエストの数30 秒:
?約 19w のリクエストを完了しました
mysql サーバーの CPU 使用率:
mysql サーバーは CPU の 52% を消費します?
2. 接続プールを使用しない短い接続ストレス テスト
php スクリプトは次のとおりです:
$obj = 新しい PDO('mysql :host=192.168.20.130;dbname=test1',"admin","admin");
$stmt = $obj->query("show tables");
$data = $stmt->fetchAll ();
var_dump($data);
リクエストを完了するまで 30 秒:?約 12w のリクエストを完了しました
mysql サーバーの CPU 占有率:
?CPU 占有率は約 122% です
接続プールに転送が要求されていますが、TCP の確立と解放にかかる時間が短縮され、合計 QPS が大幅に向上し、MySQL サーバーの負荷が大幅に軽減されていることがわかります。
上記のストレス テスト マシンは Debian、4 コア マシンです。
7. インストール:
phpize=>./configure=>make install=>echo "extensions=xx/connect_pool.so">php.ini要件:
linux 2.6+
および pdo および redis 拡張機能をインストールしています