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 长连接、连接池