루프를 통해 새 연결을 반복적으로 생성하지 않고 mysql 연결 풀에서 연결을 얻을 수 있습니다. 이 글은 MySQL 연결 풀 효과를 구현하기 위한 PHP 코드를 주로 소개합니다. 필요한 친구들이 참고하면 도움이 될 것입니다.
참조 구성 수정: 다음 글을 참고할 수 있습니다
과도한 방문을 방지하고 연결 수를 채우려면
<?php /** * @author xuleyan * @title mysql类 */ class DbHelper{ //连接池 private $_pools = []; //连接池大小 const POOLSIZE = 5; const USERNAME = "root"; const PASSWORD = "root"; const HOST = "127.0.0.1"; const DB = "test"; public function __construct() { $db = self::DB; $username = self::USERNAME; $password = self::PASSWORD; $host = self::HOST; //持久化连接 $presistent = array(PDO::ATTR_PERSISTENT => true); for ($i=0; $i < self::POOLSIZE; $i++) { $connection = new PDO("mysql:dbname=$db;host=$host", $username, $password); // sleep(3); array_push($this->_pools, $connection); } } //从数据库连接池中获取一个数据库链接资源 public function getConnection() { echo 'get' . count($this->_pools) . "<br>"; if (count($this->_pools) > 0) { $one = array_pop($this->_pools); echo 'getAfter' . count($this->_pools) . "<br>"; return $one; } else { throw new ErrorException ( "<mark>数据库连接池中已无链接资源,请稍后重试!</mark>" ); } } //将用完的数据库链接资源放回到数据库连接池 public function release($conn) { echo 'release' . count($this->_pools) . "<br>"; if (count($this->_pools) >= self::POOLSIZE) { throw new ErrorException ( "<mark>数据库连接池已满!</mark>" ); } else { array_push($this->_pools, $conn); // $conn = null; echo 'releaseAfter' . count($this->_pools) . "<br>"; } } public function query($sql) { try { $conn = $this->getConnection(); $res = $conn->query($sql); $this->release($conn); return $res; } catch (ErrorException $e) { print 'error:' . $e->getMessage(); die; } } public function queryAll($sql) { try { $conn = $this->getConnection(); $sth = $conn->prepare($sql); $sth->execute(); $result = $sth->fetchAll(); return $result; } catch (PDOException $e) { print 'error:' . $e->getMessage(); die; } } }
이것을 다른 파일에서 호출하세요
<?php require_once 'db.php'; $sql = 'select * from user'; $dbhelper = new DbHelper; for ($i=0; $i < 10; $i++) { $res = $dbhelper->query($sql); // var_dump($res) . PHP_EOL; }
PHP가 MySQL 연결에 연결한다고 생각하세요 pool 사용 방법
작은 버그로 인해 어느 날 밤 프로젝트에서 mysql에 많은 연결 요청을 보냈습니다. 동시에 mysql 서버의 DNS에 문제가 발생하여 안티 솔루션 시간 초과가 발생했습니다. . 드디어 mysql 서버가 살아서 끌려갔습니다.
드디어 버그가 수정되었고, mysql 연결 풀을 늘리는 방법을 연구했습니다.
지난 이틀간 검색해본 결과 ThinkPHP 문서에 Connection Pooling 관련 문서가 없는 것을 발견했습니다. 그래서 제가 직접 코드를 공부했어요.
우선, PHP용으로 일반적으로 사용되는 세 가지 mysql 확장 라이브러리가 있습니다: mysql, mysqli, pdo_mysql.
* mysqli는 연결 풀링을 지원하지 않습니다.
* pdo_mysql은 지원되지만 thinkPHP의 pdo 확장은 mysql을 지원하지 않고 'MSSQL','ORACLE','Ibase','OCI'만 지원합니다(Pdo.class.php의 59행 참조)
* mysql. mysql_pconnect 메소드를 통해 지원됩니다. (특정 매개변수에 대해서는 공식 PHP 문서를 참조하세요.)
1 ThinkPHP에서 긴 연결을 활성화하는 방법은 다음과 같습니다:
class BaseMysql extends Model { protected $connection = array( 'db_type' => 'mysql', 'db_user' => '***', 'db_pwd' => '*******', 'db_host' => '*******', 'db_port' => '3306', 'db_name' => 'custom', 'db_params' => array('persist' => true), ); }
이렇게 구성하면 모든 것이 잘 될 것이라고 생각한다면, 당신은 완전히 틀렸어요.
2 mysql -> my.cnf 수정된 구성:
[mysqld]
interactive_timeout =60 // 대화형 연결(mysql-client) 만료 시간.
wait_timeout =30 //긴 연결의 만료 시간입니다. 이건 바뀌어야 해! 기본값은 8시간입니다. 요청량이 많으면 곧 연결 수가 가득 차게 됩니다.
max_connections = 100 //최대 연결 수는 연결 풀의 크기로 간주할 수 있습니다
3 php.ini 수정:
[MySql]
mysql.allow_percious = On
mysql.max_pertant = 99 // 더 작아야 합니다. mysql에서 구성한 최대 연결 수
mysql.max_links = 99
4 웹 서버가 Apache인 경우 연결 유지를 활성화해야 합니다. 그렇지 않으면 요청이 종료되면 긴 연결을 재사용할 수 없습니다.
webserver는 nginx의 경우입니다.
pm = 동적 // http 요청을 처리하기 위해 일부 하위 프로세스가 기본적으로 시작됩니다.
pm.max_children // 최대 하위 프로세스 수. 이 구성은 mysql의 max_connections보다 작아야 합니다.
5 여전히 사용할 수 없는 경우 운영 체제의 연결 유지가 활성화되어 있는지 확인하세요.
개요:
Keep-alive와 데이터베이스 긴 연결을 동시에 활성화해야 합니다. 그렇지 않으면 긴 연결이 mysql 연결 리소스 수를 헛되이 차지하게 되어 재사용할 수 없습니다.
nginx + php-fpm의 경우 php-fpm 하위 프로세스와 mysql 사이의 긴 연결이 실제로 유지됩니다. 프런트 엔드 http 요청이 할당된 php-fpm 하위 프로세스는 하위 프로세스가 mysql과의 긴 연결을 재사용합니다.
관련 권장 사항:
데이터베이스 연결 풀의 PHP 구현에 대한 구체적인 분석
SQL Ralay 데이터베이스 연결 풀에 대한 PHP 작업 클래스 전송
위 내용은 PHP에서 mysql 연결 풀의 효과를 얻는 방법을 완전히 마스터하세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!