私のアプリケーションは pcntl_fork を使用して、接続されたルーターを監視する子プロセスを fork します。そこで、監視する必要があるマシンと同じ数の子プロセスに自分自身をフォークするクラス ConnectionManager をインスタンス化します。
シングルトン パターンを実装する必要がある外部 DB クラスを使用していますが、PHP はフォークされた子プロセスごとに新しいデータベース接続を構築する傾向があります。
<?php
/**
* Database
* implements Singleton Pattern
* Returns one static object via Get()
*/
include_once '../config/config.php';
class Database{
private $log;
public static $dbLink;
/**
* returns the reference to the only possible mysql resource
* @return unknown
*/
public static function Get(){
if(!self::$dbLink){
$log = Logger::getLogger(__CLASS__);
self::$dbLink = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
mysql_select_db(DB_SELECT);
if(!self::$dbLink){
$log->fatal("Connect to Database failed");
throw new Exception("Database connection failed: ".mysql_error());
}
}
return self::$dbLink;
}
public function Destroy(){
self::$dbLink = null;
}
}
?>
この問題は、監視対象のルーターの数が増えると発生します。現在、約 56 台のマシンを監視しているため、アプリケーションは基盤となるデータベースに対して 56 の一意の mysql_connections を確立します。しかし、監視対象のマシンの数が増えると、私たちのアプローチは mysql_connection_limit と衝突します。
データベースは、各ルーターのトラフィックを格納するために使用されます。さらに、各子プロセスは、トラフィック データの最後の取得や実行許可などを含むランタイム データを保存します。
私の質問は、接続を 1 つだけ使用できるかどうかです。SQL ステートメントを収集し、クエリとしてデータベースに送信するキャッシュのようなもの。
しかし、上記のようなアプローチをどのように設計すればよいでしょうか?
さらに詳しい情報が必要な場合は、お問い合わせください。一部の抜粋を掲載します。