0

我试图找出通过 FastCGI 和使用 PHP-FPM 在 PHP、MySQL 设置中处理数据库通信的最佳方法;这适用于一个使用量相对较大的站点,每秒有 100 到 1,000 个 SQL 查询,所以我想让事情尽可能高效。

我正在重写网站的部分内容,并且在新代码中我正在使用 PDO,并通过执行 database::insertEmployee($name, $SIN, $DOB, $position) 来处理 DB 查询和连接。我担心的是,每次查询都会建立一个新的 PDO 连接。我应该尝试建立持久连接吗???

class database
{
    protected $dbh;
    protected static $instance;

    private function __construct()
    {
        try {
        // building data source name from config
            $dsn = 'mysql:=' . DB_Config::read('db.host') .
                   ';dbname='  . DB_Config::read('db.name');
            $user = DB_Config::read('db.user');
            $password = DB_Config::read('db.password');
            $this->dbh = new PDO($dsn, $user, $password);
            $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (PDOException $e) {
            //@TODO-KP: log and alert
            print "Error!: " . $e->getMessage() . "<br/>";
            die();
        }

    }

    public static function getInstance()
    {
        if (!isset(self::$instance)) {
            $object = __CLASS__;
            self::$instance = new $object;
        }
        return self::$instance;
    }

    public static function insertEmployee($name, $position, $SIN, $DOB)
    {
        $dbi = self::getInstance();

        try {
            $sthEmployee = $dbi->dbh->prepare('INSERT INTO employees SET
                                                name = :name
                                                , position = :position
                                                , SIN = :SIN
                                                , DOB = :DOB'
            );

            $sthEmployee->bindParam(':name', $name);
            $sthEmployee->bindParam(':position', $position);
            $sthEmployee->bindParam(':SIN', $SIN);
            $sthEmployee->bindParam(':DOB', date('Y-m-d G:i:s', $DOB));

            return $sthEmployee->execute();

        } catch (PDOException $e) {
            //@FIXME-KP: log and alert
            print "Error!: " . $e->getMessage() . "-- name [$name]";
            return '';
        }
    }
}

任何关于最有效方法的想法都将非常非常感激!

凯瑟琳。

4

1 回答 1

0

我担心的是,每次查询都会建立一个新的 PDO 连接。

好吧,请验证您的担忧,因为我会说情况可能并非如此。

出于性能原因,请注意在后台使用 mysql 本机驱动程序,因为这允许 PHP 与数据库交互的扩展指标。

还可以从 Oracle 获得针对 Mysql 的专业支持计划,他们有很好的监控工具和非常好的支持,可以帮助您准备好数据库和 PHP 代码以处理流量。

于 2013-04-15T22:15:38.487 回答