이번에는 PHP에서 mysql 연결 풀 효과를 구현하는 단계에 대해 자세히 설명하겠습니다. php에서 mysql 연결 풀 효과를 구현하는 데 사용할 주의 사항은 다음과 같습니다. 봐.
루프를 통해 새 연결을 반복적으로 생성하지 않고 mysql 연결 풀에서 연결을 얻을 수 있습니다.
참조 구성 수정: 다음 글을 참고하시면 됩니다
과도한 방문을 방지하고 연결 수를 채우려면
<?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; }
ThinkPHP의 연결 풀을 사용하여 MySQL에 연결하는 방법
작은 버그로 인해 어느 날 밤 프로젝트에서 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_pertant = 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 중국어 웹사이트의 다른 관련 기사를 주목하세요!
추천 도서:
PHP에서 다중 선형 회귀 시뮬레이션 곡선 알고리즘을 구현하는 단계에 대한 자세한 설명
PHP에서 큰따옴표로 묶인 배열 요소에 액세스할 때 오류를 처리하는 방법
위 내용은 PHP에서 mysql 연결 풀 효과를 구현하는 단계에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!