最新消息:

PHP MySql 长连接、连接池

Mysql 327浏览 0评论

PHP 连接Mysql 常见有三种方式:

mysql 扩展、mysqli扩展、pdo_mysql 扩展(官方提供推荐使用的连接方式)。

PHP 的运行机制是当前页面执行完成会释放当前PHP进程中的所有资源。例如有多个并发访问页面 http://www.wecot.com/test.php ,根据PHP对应的web服务器的不同,会开相应的线程或进程去处理该请求,请求完成了会释放结果。也就是PHP无法在语言层面执行页面到页面之间的数据传递,但是mysql_pconnect 和 pdo 中的 ATTR,设置 array(PDO::ATTR_PERSISTENT=>true) 可以实现mysql 的长连接。

代码如下:

$conn = new PDO(
    $dsn, 
    DB_USER, 
    DB_PASSWORD, 
    [PDO:ATTR_PERSISTENT=>true]
);

长连接最大的特点是,在高负载的情况下,通过连接复用,节省了新建连接时产生的资源消耗和时间消耗。

由于PHP的运行方式有多种,因而长连接的实现方式也有多种。PHP没有进程池和连接池这种概念,所以这个需要 web 服务器支持才可以实现长连接。

swoole 扩展可以很好的实现mysql连接池:http://rango.swoole.com/archives/265

另外,一般中小型web项目,即并发数在 700 以下的项目,PHP自身的性能是够用的,数据连接方面的优化建议是使用单例模式,减少资源重复申请分配造成的资源消耗,一个简单的单例连接模式例子:

/**
 * 数据库pdo连接
 * Created by PhpStorm.
 * User: wecot
 * Date: 18-12-18
 * Time: 下午11:34
 */
class myPDO
{
    private static $pdo;
    
    private function __construct()
    {
    }
    
    private function __clone()
    {
    }
    /**
     * 获取实例化的PDO,单例模式
     * @return PDO
     */
    public static function getInstance($option)
    {
        if (!(self::$pdo instanceof PDO)) {
            $dsn = "mysql:host=" . $option['host'] . ";port=" . $option['port'] 
            . ";dbname=" . $option['dbName'] . ";charset=" . $option['charSet'];
            
            try {
                self::$pdo = new PDO(
                    $dsn, 
                    $option['user'], 
                    $option['password'], 
                    [
                        PDO::ATTR_PERSISTENT => true, //保持长连接
                        PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
                    ]
                ); 
                
                self::$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
            } catch (PDOException $e) {
                print "Error:" . $e->getMessage() . "<br/>";
                die();
            }
        }
        
        return self::$pdo;
    }
}

Mysqli 的连接方式

/**
 * Created by PhpStorm.
 * User: wecot
 * Date: 18-12-18
 * Time: 下午11:34
 */
class Database
{
    public static $instance = null;
    private $conn = null;
    
    private function __construct(array $option)
    {
        $this->conn = new mysqli(
        $option['host'], 
        $option['username'], 
        $option['password'], 
        $option['db_name'], 
        $option['port']
        );
    }
    
    private function __clone()
    {
        // TODO: Implement __clone() method.
    }
    
    public static function getInstance($option)
    {
        if (false === (self::$instance instanceof self)) {
            self::$instance = new self($option);
        }
        return self::$instance;
    }
    
    public function getConn()
    {
        return $this->conn;
    }
}

转载请注明:微刻 blog.wecot.cn » PHP MySql 长连接、连接池

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址