pdo 인스턴스와 pdo 긴 연결을 캡슐화하는 PHP의 장점과 단점
이 기사에서는 PHP에서 pdo를 캡슐화하는 예와 pdo 긴 연결에 대한 관련 지식을 제공합니다. 이름에서 알 수 있듯이 긴 연결은 일반적인 짧은 연결과 비교하여 항상 연결을 유지합니다. 연결이 길면 생성 프로세스가 효과적으로 줄어들고 성능이 저하될 수 있습니다. 모두에게 도움이 되기를 바랍니다!
1. 소개
최근 크래시 로그 저장을 구현하는 스크립트를 작성해야 하는데 예상대로 프레임워크와 분리되어 있으므로 데이터베이스 관련 작업만 직접 캡슐화할 수 있습니다. 여기의 블로거는 데이터베이스를 작동하기 위해 pdo
를 캡슐화하기로 결정했습니다. pdo
操作数据库相关。
二、为什么选择pdo
众所周知的,php
在早期的时候是带有mysql
扩展的,但是后来由于过于古老缺失了mysql
的新特性,因此主键没落。
从php5
开始,更建议大家使用mysqli
扩展,这个是mysql
扩展的增强版,是一个面向对象的MySQL
接口,更容易使用。缺点是只能操作mysql
,不够强大。
还有就是pdo
扩展了,这个是最丰富的的一个扩展,支持多种数据库,重要的是,在安全上是比其他两种扩展都要强的,通过使用prepared
预处理更是有效的防止sql
注入。因此,博主这里选择了封装pdo
相关的操作。
三、pdo的长连接
1、什么是pdo的长连接
长连接顾名思义就是一直保持连接,相对于平时的短连接,每次请求都会重新创建链接来说,长连接可以有效的减少创建的过程,可以更好的节省性能。
在操作上是在连接数据库的时候,多加一个参数:
$pdo = new PDO($dsn, $username, $passwd, [PDO::ATTR_PERSISTENT => true]);
后面的PDO::ATTR_PERSISTENT => true
就是开启长连接的方法。
2、长连接对nginx无效吗
博主在搜索长连接相关知识的时候,看到一篇文章,结论是长连接仅适用于apache,不适用于nginx
,这是真的吗?
参考博文地址:https://www.cnblogs.com/wpjamer/articles/7106389.html
大致结论是:长连接更多的是针对于apache
的,因为apache
维护一个进程池,开启了apache mpm
功能之后,apache
会默认维持一个进程池,mysql
长连接之后的连接,并没有作为socet
连接关闭,而是作为一个不释放的东西,放进了进程池/线程池里面去。
而对于nginx
来说,长连接是无效的,脚本执行结束则释放资源?
3、php-fpm下的长连接测试
这里前辈已经测试过了,咱们给出前辈的地址,大家有兴趣的可以看看
参考博文地址:https://hacpai.com/article/1526490593632
结论:
事实证明php-fpm
是可以实现长连接的,只是如果该进程空闲的话,会造成资源浪费。
php-fpm
的配置文件可以考虑设置pm.max_requests = 1000
,代表每一个子进程的最大请求服务数量,如果超过了这个值,该子进程会被自动重启。
比如max_requests
这个参数,如果设置很大的话,那这个子进程要运行很多次才会重启,假如这个请求发生了错误或者内存泄漏,那么这个值设置很大是不合适的。但如果请求没有问题,这个值设置小的话就会频繁的重启,这样也会碰到不少502
的问题,所以要仁者见仁,智者见智的设置了,这里初始化设置1000
,如果测试没有内存泄漏等问题,可以再大一些。
4、长连接对事务的影响
参考博文地址:https://www.zhihu.com/question/62603122
总结: 如果业务并发比较大且带有事务,不建议使用长连接的方式。
5、总结
博主在不断的搜索中,发现长连接要发挥出最佳性能始终是避不开连接池这点的,而php恰恰又不能很好的实现连接池,这点确实是有点小遗憾。
整体来说在php
中是暂时无法配置和mysql
php
에는 초기에는 mysql
확장이 있었지만 나중에는 너무 오래되어 mysql이 누락되었습니다.
의 새로운 기능으로 인해 기본 키가 사라졌습니다. 🎜🎜 php5
부터는 mysqli
확장을 사용하는 것이 좋습니다. 이는 mysql
확장의 향상된 버전이며 객체입니다. 지향적인 MySQL
인터페이스로 사용이 더 쉽습니다. 단점은 mysql
만 실행할 수 있고 충분히 강력하지 않다는 점입니다. 🎜🎜 pdo
확장도 있습니다. 이것은 가장 풍부한 확장이며 다양한 데이터베이스를 지원합니다. 중요한 점은 prepared 전처리는 sql
삽입 방지에 더 효과적입니다. 따라서 여기의 블로거는 pdo
관련 작업을 캡슐화하기로 결정했습니다. 🎜🎜3. pdo의 긴 연결🎜1. pdo의 긴 연결이란
🎜 이름에서 알 수 있듯이 긴 연결은 항상 연결을 유지한다는 의미입니다. 각 요청마다 다시 생성됩니다. 연결이 길면 생성 프로세스가 효과적으로 줄어들고 성능이 향상됩니다. 🎜🎜작업 중 데이터베이스에 연결할 때 매개변수를 하나 더 추가합니다. 🎜https://github.com/nadirvishun/php-pdo-class
/** * @params:重连函数,上限3次 * @date:2020/3/18 * @time:17:03 */ public function customConnect() { try { $this->pdo = new PDO($this->config['dsn'], $this->config['username'], $this->config['password'], $this->config['params']); $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //需要将错误处理模式变成异常模式 return true; } catch (Exception $e) { if (stripos($e->getMessage(), 'MySQL server has gone away') !== false || stripos($e->getMessage(),' bytes failed with errno=10053') !==false) { $this->close(); $this->tryNums++; if ($this->tryNums > 3) { return false; } self::customConnect(); } else { $this->throw_exception($e->getMessage()); return false; } } }
PDO::ATTR_PERSISTENT => true
는 긴 연결을 여는 방법입니다. 🎜2. 긴 연결은 nginx에 유효하지 않습니까?
🎜 블로거가 긴 연결에 대한 지식을 검색하던 중 기사를 보고 긴 연결은 Apache에만 적용되고nginx에는 적용되지 않는다는 결론을 내렸습니다. /code>, 이게 사실인가요? 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">//自定义warnings处理函数set_error_handler('customException');//拿到warnngs错误之后,转化为error错误抛出,这样就可以被try..catch捕获function customException( $error_no, $error_msg, $error_file, $error_line){
throw new \Exception($error_msg,0,null);
//throw new \Exception($error_msg);}</pre><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div>🎜 일반적인 결론은 다음과 같습니다. <code>apache
가 프로세스 풀을 유지하고 기능 이후에 apache mpm
을 활성화하기 때문에 긴 연결은 apache
를 더 대상으로 합니다. , apache
는 기본적으로 프로세스 풀을 유지 관리합니다. mysql
긴 연결 이후의 연결은 socket
연결로 닫히지 않고 사물로 닫힙니다. 해제되지 않은 것은 프로세스 풀/스레드 풀에 저장됩니다. 🎜🎜 그리고 nginx
의 경우 긴 연결은 유효하지 않으며 스크립트 실행이 끝나면 리소스가 해제되나요? 🎜3. php-fpm에서의 긴 연결 테스트
🎜선배님들이 여기서 이미 테스트해 봤습니다. 관심 있으신 선배님들의 주소를 알려드리겠습니다🎜/** * destruct 关闭数据库连接 */ public function destruct() { $this->pdo = null; }
php-fpm
이 긴 연결을 달성할 수 있다는 사실이 입증되었지만 프로세스가 유휴 상태인 경우 리소스 낭비가 발생합니다. 🎜🎜 php-fpm
의 구성 파일은 이 값이 초과되는 경우 각 하위 프로세스에 대한 최대 요청 서비스 수를 나타내는 pm.max_requests = 1000
설정을 고려할 수 있습니다. , 자식 프로세스가 자동으로 다시 시작됩니다. 🎜🎜 예를 들어 max_requests
매개변수가 매우 큰 값으로 설정된 경우 이 요청에서 오류가 발생하거나 메모리 누수가 발생하면 다시 시작하기 전에 하위 프로세스를 여러 번 실행해야 합니다. 이 값을 매우 큰 값으로 적절하게 설정하는 것은 부적절합니다. 하지만 요청에 문제가 없다면 이 값을 작은 값으로 설정하면 자주 다시 시작하게 되고 이 역시 502
문제가 많이 발생하게 되므로 판단의 문제이고 지혜. 초기화 설정1000
은 다음과 같습니다. 테스트에 메모리 누수 및 기타 문제가 없으면 더 커질 수 있습니다. 🎜4. 긴 연결이 트랜잭션에 미치는 영향
public function query($sql = null, $param = null) { //检测连接是否活跃 $this->pdo_ping(); //判断之前是否有结果集 if (!empty($this->PDOStatement)) { $this->free(); } xxxxxxxxxx }
5. 요약
🎜 블로거는 지속적인 검색 중에 긴 연결의 최상의 성능을 달성하기 위해서는 연결 풀을 피할 수 없으며 PHP가 연결을 잘 실현할 수 없다는 것을 발견했습니다. 사실 좀 아쉽습니다. 🎜🎜 일반적으로php
에서 mysql
로 완벽한 연결 풀을 구성하는 것은 일시적으로 불가능합니다. 비즈니스가 복잡한 곳에서는 긴 연결을 사용하는 것이 좋습니다. 주의하세요. 모두 하나의 스레드이므로 많은 리소스가 낭비됩니다. 🎜 如果是某些业务需要持续的数据库操作,比如提交日志接口等,那么是可以考虑打开长连接的,记得设置max_requests
来定量关闭php-fpm
连接,fpm
关闭之后也会自动释放mysql
的连接。
还有pm.max_spare_servers
设置服务器空闲时最大php-fpm
进程数量。
例如: pm.max_spare_servers = 25
如果空闲时,会检查进程数,多于25
个了,就会关闭几个,达到25
个的状态。
擅长swoole
的同学,可以参考这篇文章:
基于swoole扩展实现真正的PHP数据库连接池
四、pdo部分demo的封装
首先这部分博主是参考了一个网友的封装,github
地址如下:
https://github.com/nadirvishun/php-pdo-class
这个网友基本的增删改查都封装好了,而且都有参数预处理,安全性还是可以的。不过既然作为一个基准的类,还是缺少一些东西。
1、断线重连机制
例如重连函数:
/** * @params:重连函数,上限3次 * @date:2020/3/18 * @time:17:03 */ public function customConnect() { try { $this->pdo = new PDO($this->config['dsn'], $this->config['username'], $this->config['password'], $this->config['params']); $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //需要将错误处理模式变成异常模式 return true; } catch (Exception $e) { if (stripos($e->getMessage(), 'MySQL server has gone away') !== false || stripos($e->getMessage(),' bytes failed with errno=10053') !==false) { $this->close(); $this->tryNums++; if ($this->tryNums > 3) { return false; } self::customConnect(); } else { $this->throw_exception($e->getMessage()); return false; } } }
2、转化php warnings为try…catch可捕获的错误
这步原因是长连接会频繁的造成mysql gone away
错误,而这个错误是php
的warnings
级别错误,try..catch
根本就捕获不到,所以博主这里自定义错误处理函数来处理。
这部分是转化php
的warnings
错误为try..catch
可以捕获的error
错误,关于php
的报错机制以及错误处理这块,咱们下篇再讨论。
//自定义warnings处理函数set_error_handler('customException');//拿到warnngs错误之后,转化为error错误抛出,这样就可以被try..catch捕获function customException( $error_no, $error_msg, $error_file, $error_line){ throw new \Exception($error_msg,0,null); //throw new \Exception($error_msg);}
3、析构方法回收资源
/** * destruct 关闭数据库连接 */ public function destruct() { $this->pdo = null; }
4、query的时候ping一下
public function query($sql = null, $param = null) { //检测连接是否活跃 $this->pdo_ping(); //判断之前是否有结果集 if (!empty($this->PDOStatement)) { $this->free(); } xxxxxxxxxx }
5、下载地址
这四步完善之后,这个pdo的类还是可以用的,大家需要的话可以去百度云上下载。
链接: https://pan.baidu.com/s/1Siz_bKlhEIVNV99Y0zTzqw 提取码: ebqx
大家如果感兴趣的话,可以点击《PHP视频教程》进行更多关于PHP知识的学习。
위 내용은 pdo 인스턴스와 pdo 긴 연결을 캡슐화하는 PHP의 장점과 단점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

이 튜토리얼은 PHP를 사용하여 XML 문서를 효율적으로 처리하는 방법을 보여줍니다. XML (Extensible Markup Language)은 인간의 가독성과 기계 구문 분석을 위해 설계된 다목적 텍스트 기반 마크 업 언어입니다. 일반적으로 데이터 저장 AN에 사용됩니다

JWT는 주로 신분증 인증 및 정보 교환을 위해 당사자간에 정보를 안전하게 전송하는 데 사용되는 JSON을 기반으로 한 개방형 표준입니다. 1. JWT는 헤더, 페이로드 및 서명의 세 부분으로 구성됩니다. 2. JWT의 작업 원칙에는 세 가지 단계가 포함됩니다. JWT 생성, JWT 확인 및 Parsing Payload. 3. PHP에서 인증에 JWT를 사용하면 JWT를 생성하고 확인할 수 있으며 사용자 역할 및 권한 정보가 고급 사용에 포함될 수 있습니다. 4. 일반적인 오류에는 서명 검증 실패, 토큰 만료 및 대형 페이로드가 포함됩니다. 디버깅 기술에는 디버깅 도구 및 로깅 사용이 포함됩니다. 5. 성능 최적화 및 모범 사례에는 적절한 시그니처 알고리즘 사용, 타당성 기간 설정 합리적,

정적 바인딩 (정적 : :)는 PHP에서 늦은 정적 바인딩 (LSB)을 구현하여 클래스를 정의하는 대신 정적 컨텍스트에서 호출 클래스를 참조 할 수 있습니다. 1) 구문 분석 프로세스는 런타임에 수행됩니다. 2) 상속 관계에서 통화 클래스를 찾아보십시오. 3) 성능 오버 헤드를 가져올 수 있습니다.

문자열은 문자, 숫자 및 기호를 포함하여 일련의 문자입니다. 이 튜토리얼은 다른 방법을 사용하여 PHP의 주어진 문자열의 모음 수를 계산하는 방법을 배웁니다. 영어의 모음은 A, E, I, O, U이며 대문자 또는 소문자 일 수 있습니다. 모음이란 무엇입니까? 모음은 특정 발음을 나타내는 알파벳 문자입니다. 대문자와 소문자를 포함하여 영어에는 5 개의 모음이 있습니다. a, e, i, o, u 예 1 입력 : String = "Tutorialspoint" 출력 : 6 설명하다 문자열의 "Tutorialspoint"의 모음은 u, o, i, a, o, i입니다. 총 6 개의 위안이 있습니다

PHP의 마법 방법은 무엇입니까? PHP의 마법 방법은 다음과 같습니다. 1. \ _ \ _ Construct, 객체를 초기화하는 데 사용됩니다. 2. \ _ \ _ 파괴, 자원을 정리하는 데 사용됩니다. 3. \ _ \ _ 호출, 존재하지 않는 메소드 호출을 처리하십시오. 4. \ _ \ _ get, 동적 속성 액세스를 구현하십시오. 5. \ _ \ _ Set, 동적 속성 설정을 구현하십시오. 이러한 방법은 특정 상황에서 자동으로 호출되어 코드 유연성과 효율성을 향상시킵니다.

PHP와 Python은 각각 고유 한 장점이 있으며 프로젝트 요구 사항에 따라 선택합니다. 1.PHP는 웹 개발, 특히 웹 사이트의 빠른 개발 및 유지 보수에 적합합니다. 2. Python은 간결한 구문을 가진 데이터 과학, 기계 학습 및 인공 지능에 적합하며 초보자에게 적합합니다.

PHP는 서버 측에서 널리 사용되는 스크립팅 언어이며 특히 웹 개발에 적합합니다. 1.PHP는 HTML을 포함하고 HTTP 요청 및 응답을 처리 할 수 있으며 다양한 데이터베이스를 지원할 수 있습니다. 2.PHP는 강력한 커뮤니티 지원 및 오픈 소스 리소스를 통해 동적 웹 컨텐츠, 프로세스 양식 데이터, 액세스 데이터베이스 등을 생성하는 데 사용됩니다. 3. PHP는 해석 된 언어이며, 실행 프로세스에는 어휘 분석, 문법 분석, 편집 및 실행이 포함됩니다. 4. PHP는 사용자 등록 시스템과 같은 고급 응용 프로그램을 위해 MySQL과 결합 할 수 있습니다. 5. PHP를 디버깅 할 때 error_reporting () 및 var_dump ()와 같은 함수를 사용할 수 있습니다. 6. 캐싱 메커니즘을 사용하여 PHP 코드를 최적화하고 데이터베이스 쿼리를 최적화하며 내장 기능을 사용하십시오. 7

PHP는 전자 상거래, 컨텐츠 관리 시스템 및 API 개발에 널리 사용됩니다. 1) 전자 상거래 : 쇼핑 카트 기능 및 지불 처리에 사용됩니다. 2) 컨텐츠 관리 시스템 : 동적 컨텐츠 생성 및 사용자 관리에 사용됩니다. 3) API 개발 : 편안한 API 개발 및 API 보안에 사용됩니다. 성능 최적화 및 모범 사례를 통해 PHP 애플리케이션의 효율성과 유지 보수 성이 향상됩니다.
