찾다
백엔드 개발PHP 튜토리얼PHP는 mysql 연결 풀의 효과를 구현합니다.

이 기사에서는 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 &#39;get&#39; . count($this->_pools) . "<br>";
    if (count($this->_pools) > 0) {
      $one = array_pop($this->_pools);
      echo &#39;getAfter&#39; . count($this->_pools) . "<br>";
      return $one;
    } else {
      throw new ErrorException ( "<mark>数据库连接池中已无链接资源,请稍后重试!</mark>" );
    }
  }

  //将用完的数据库链接资源放回到数据库连接池
  public function release($conn)
  {
    echo &#39;release&#39; . count($this->_pools) . "<br>";
    if (count($this->_pools) >= self::POOLSIZE) {
      throw new ErrorException ( "<mark>数据库连接池已满!</mark>" );
    } else {
      array_push($this->_pools, $conn);
      // $conn = null;
      echo &#39;releaseAfter&#39; . 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 &#39;error:&#39; . $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 &#39;error:&#39; . $e->getMessage();
      die;
    }
  }
}

이것을 다른 파일에서 호출하세요

<?php 

require_once &#39;db.php&#39;;
$sql = &#39;select * from user&#39;;

$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(
    &#39;db_type&#39; => &#39;mysql&#39;,
    &#39;db_user&#39; => &#39;***&#39;,
    &#39;db_pwd&#39; => &#39;*******&#39;,
    &#39;db_host&#39; => &#39;*******&#39;,
    &#39;db_port&#39; => &#39;3306&#39;,
    &#39;db_name&#39; => &#39;custom&#39;,
    &#39;db_params&#39; => array(&#39;persist&#39; => 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
图文详解mysql架构原理图文详解mysql架构原理May 17, 2022 pm 05:54 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于架构原理的相关内容,MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层,下面一起来看一下,希望对大家有帮助。

mysql的msi与zip版本有什么区别mysql的msi与zip版本有什么区别May 16, 2022 pm 04:33 PM

mysql的msi与zip版本的区别:1、zip包含的安装程序是一种主动安装,而msi包含的是被installer所用的安装文件以提交请求的方式安装;2、zip是一种数据压缩和文档存储的文件格式,msi是微软格式的安装包。

mysql怎么去掉第一个字符mysql怎么去掉第一个字符May 19, 2022 am 10:21 AM

方法:1、利用right函数,语法为“update 表名 set 指定字段 = right(指定字段, length(指定字段)-1)...”;2、利用substring函数,语法为“select substring(指定字段,2)..”。

mysql怎么替换换行符mysql怎么替换换行符Apr 18, 2022 pm 03:14 PM

在mysql中,可以利用char()和REPLACE()函数来替换换行符;REPLACE()函数可以用新字符串替换列中的换行符,而换行符可使用“char(13)”来表示,语法为“replace(字段名,char(13),'新字符串') ”。

MySQL复制技术之异步复制和半同步复制MySQL复制技术之异步复制和半同步复制Apr 25, 2022 pm 07:21 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于MySQL复制技术的相关问题,包括了异步复制、半同步复制等等内容,下面一起来看一下,希望对大家有帮助。

mysql怎么将varchar转换为int类型mysql怎么将varchar转换为int类型May 12, 2022 pm 04:51 PM

转换方法:1、利用cast函数,语法“select * from 表名 order by cast(字段名 as SIGNED)”;2、利用“select * from 表名 order by CONVERT(字段名,SIGNED)”语句。

mysql怎么判断是否是数字类型mysql怎么判断是否是数字类型May 16, 2022 am 10:09 AM

在mysql中,可以利用REGEXP运算符判断数据是否是数字类型,语法为“String REGEXP '[^0-9.]'”;该运算符是正则表达式的缩写,若数据字符中含有数字时,返回的结果是true,反之返回的结果是false。

mysql怎么删除unique keymysql怎么删除unique keyMay 12, 2022 pm 03:01 PM

在mysql中,可利用“ALTER TABLE 表名 DROP INDEX unique key名”语句来删除unique key;ALTER TABLE语句用于对数据进行添加、删除或修改操作,DROP INDEX语句用于表示删除约束操作。

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.