php-cp の概要

WBOY
WBOYオリジナル
2016-06-23 13:41:101396ブラウズ

php-cp (php-connect-pool) は、PHP 拡張機能で書かれたデータベース接続プールです。

PHP は開発が速く、起業家としての迅速な反復に適していることはわかっていますが、トラフィックが増加すると、PHP の多数の短い接続により DB 層が不必要に消費され、PHP のリクエスト処理プロセス中に接続が保持されます。ユーザー間で TCP 接続を共有できないことが原因で、接続数が増加すると MySQL のパフォーマンスが急激に低下するため、多くの大企業は Java への切り替えを余儀なくされます。それは、PHP には接続プールがないということです。もちろん、オープンソース データベース ミドルウェアを使用してこの問題を軽減することもできますが、このプロジェクトには既存のオープンソース製品とは次のような違いがあります。

1. 市場にある他のオープンソース データベース ミドルウェア製品とは異なります:

1. アプリケーション サーバー上で実行されるプロキシ プロセスなので、外部依存関係の層が軽減されます。 、これにより、アーキテクチャがよりシンプルになり、すっきりし、信頼性が高くなります。

2. パフォーマンスが向上し、効率的な ipc を通じて php プロセスと通信し、プロトコル解析の消費を回避します。

3. Redis と mysql を同時にサポートし、2 つの別々のミドルウェア システムを展開する必要はありません。

2. 簡単な概略図:

3. 技術的特徴

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. 使用します

1. pool.ini ファイルを /etc/ に配置し、必要に応じて内部の設定を変更します。

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($pdo_config,CP_DEFAULT_PDO_PORT);

get_disable_list($redis_conf,CP_DEFAULT_REDIS_PORT) ;

- 最初のパラメータは設定ファイルです

- 設定ファイルが変更されると、使用できないリストがクリアされます

6. ストレス テスト:

1。プール:

php スクリプトは次のとおりです:

$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

要件:

PHP 5.3 +(zts なし) )

linux 2.6+

および pdo および redis 拡張機能をインストールしています

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。