0

我的应用程序使用 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 语句并将它们作为查询发送到数据库。

但是我该如何设计一种如上所述的方法呢?

如果需要更多信息,请询问,我会发布一些片段。

4

1 回答 1

2

据我所知,在 PHP 中没有办法做到这一点(连接池)

您可以 mysql_pconnect 在下一个请求中重用。但这可能无法满足您的需要。

否则这可能对你有用

https://github.com/junamai2000/mod_namy_pool#readme

“用于 prefork 服务器(如 php)的 mysql 连接池模块。您可以通过在父进程和子进程之间共享连接来限制连接数”

于 2013-09-18T09:11:30.550 回答