我的应用程序使用pcntl_fork来分叉监视连接的路由器的子进程。因此,我实例化了 ConnectionManager 类,该类将自己分叉为需要监视的机器的尽可能多的子进程。
我正在使用一个外部数据库类,它应该实现单例模式,但 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发生冲突。
数据库用于存储每个路由器的流量。此外,每个子进程存储运行时数据,其中包含例如流量数据的最后一次检索或运行允许。
我的问题是,是否可以只使用一个连接。类似于缓存的东西,它收集 SQL 语句并将其作为查询发送到数据库。
但是我如何设计如上所述的方法呢?
如果需要更多信息,请询问,我会发布一些片段。
据我所知,在PHP(连接池)中没有办法做到这一点
您可以mysql_pconnect在下一个请求中重复使用。 但这可能无法满足您的需求。
否则可能对您有用
https://github.com/junamai2000/mod_namy_pool#readme
"用于预分叉服务器(如 php)的 mysql 连接池模块。您可以通过对父进程和子进程进行设置连接来限制连接数"