이 기사에서는 mysql 연결 풀 효과를 구현하기 위한 PHP 코드를 주로 소개합니다. 필요한 친구는 이를 참조할 수 있습니다.
Loop를 사용하면 새 연결을 반복적으로 생성하지 않고 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 중국어 홈페이지를 참고해주세요!
관련 권장 사항:
thinkphp3.2.3 버전 데이터베이스 추가, 삭제, 수정 및 구현 코드 확인
위 내용은 PHP는 mysql 연결 풀의 효과를 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!