


Die Vor- und Nachteile der PHP-Kapselung von PDO-Instanzen und langen PDO-Verbindungen
Dieser Artikel enthält Beispiele für die PHP-Kapselung von PDO sowie relevantes Wissen über lange PDO-Verbindungen. Wie der Name schon sagt, bleibt die Verbindung immer erhalten. Mit jeder Anfrage erstellte lange Verbindungen können den Erstellungsprozess effektiv verkürzen und Leistung sparen. Hoffe, es hilft allen!
1. Einführung
Kürzlich musste ich ein Skript schreiben, um die Speicherung von Absturzprotokollen zu realisieren. Wie erwartet ist es vom Framework getrennt, also können wir nur datenbankbezogene Vorgänge selbst kapseln. Der Blogger hier hat sich dafür entschieden, pdo
zu kapseln, um die Datenbank zu betreiben. 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
in den frühen Tagen die Erweiterung mysql
, aber später war sie zu alt und es fehlte mysql
s neue Funktionen, daher ist der Primärschlüssel weg. 🎜🎜 Ab php5
wird empfohlen, die Erweiterung mysqli
zu verwenden. Dies ist eine erweiterte Version der Erweiterung mysql
und ein Objekt -orientierte MySQL
Schnittstelle, einfacher zu verwenden. Der Nachteil besteht darin, dass es nur mysql
bedienen kann und nicht leistungsstark genug ist. 🎜🎜 Es gibt auch die Erweiterung pdo
. Dies ist die umfangreichste Erweiterung und unterstützt eine Vielzahl von Datenbanken. Wichtig ist, dass sie in Bezug auf die Sicherheit stärker ist als die anderen beiden Erweiterungen Die >prepared-Vorverarbeitung verhindert wirksamer die sql
-Injection. Daher hat sich der Blogger hier dafür entschieden, pdo
-bezogene Vorgänge zu kapseln. 🎜🎜3. Lange Verbindung von pdo🎜1. Was ist eine lange Verbindung von pdo?
🎜 Wie der Name schon sagt, bedeutet lange Verbindung, die Verbindung ständig aufrechtzuerhalten wird bei jeder Anfrage neu erstellt. Lange Verbindungen können den Erstellungsprozess effektiv verkürzen und die Leistung verbessern. 🎜🎜Fügen Sie im Betrieb beim Herstellen einer Verbindung zur Datenbank einen weiteren Parameter hinzu: 🎜https://github.com/nadirvishun/php-pdo-class
PDO::ATTR_PERSISTENT => true
dahinter ist die Methode zum Ermöglichen langer Verbindungen. 🎜2. Sind lange Verbindungen für Nginx ungültig?
🎜 Als der Blogger nach Wissen über lange Verbindungen suchte, sah er einen Artikel mit der Schlussfolgerung, dass lange Verbindungen nur für Apache und nicht für gelten nginx.
, ist das wahr? 🎜/** * @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; } } }
Apache
ab, da Apache
einen Prozesspool verwaltet und Apache MPM
nach der Funktion aktiviert , apache
verwaltet standardmäßig einen Prozesspool. Die Verbindung nach der langen mysql
-Verbindung wird nicht als socet
-Verbindung geschlossen, sondern als Things Nicht freigegebene Dateien werden in den Prozesspool/Threadpool gestellt. 🎜🎜 Und für nginx
sind lange Verbindungen ungültig und Ressourcen werden freigegeben, wenn die Skriptausführung endet? 🎜3. Langer Verbindungstest unter php-fpm
🎜Die Senioren haben es hier bereits getestet. Wenn Sie interessiert sind, können Sie einen Blick darauf werfen🎜//自定义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);}
Fakten haben bewiesen, dass
php-fpm
lange Verbindungen erreichen kann, aber wenn der Prozess inaktiv ist, führt dies zu einer Verschwendung von Ressourcen. 🎜🎜 Die Konfigurationsdatei von php-fpm
kann die Einstellung von pm.max_requests = 1000
in Betracht ziehen, was die maximale Anzahl von Anforderungsdiensten für jeden untergeordneten Prozess darstellt, wenn dieser Wert überschritten wird , wird das Kind Der Vorgang wird automatisch neu gestartet. 🎜🎜 Wenn beispielsweise der Parameter max_requests
auf einen sehr großen Wert eingestellt ist, muss der Unterprozess viele Male ausgeführt werden, bevor er neu gestartet wird Es ist unangemessen, diesen Wert auf einen sehr großen Wert festzulegen. Wenn jedoch kein Problem mit der Anforderung vorliegt und dieser Wert auf einen kleinen Wert eingestellt ist, wird er häufig neu gestartet, wodurch auch viele 502
-Probleme auftreten, sodass dies eine Frage des Ermessens ist Weisheit. Hier ist die Initialisierungseinstellung 1000
. Wenn der Test keine Speicherlecks und andere Probleme aufweist, kann sie größer sein. 🎜4. Die Auswirkungen langer Verbindungen auf Transaktionen
/** * destruct 关闭数据库连接 */ public function destruct() { $this->pdo = null; }
5. Zusammenfassung
🎜 Während der kontinuierlichen Suche stellte der Blogger fest, dass der Verbindungspool nicht vermieden werden kann und PHP die Verbindung nicht gut realisieren kann ist in der Tat etwas schade. 🎜🎜 Im Allgemeinen ist es vorübergehend unmöglich, einen perfekten Verbindungspool mitmysql
in php
zu konfigurieren. An Orten, an denen das Geschäft komplexer ist, ist es besser, lange Verbindungen zu verwenden mit Vorsicht: Sie sind alle 1 Thread, was eine Menge Ressourcenverschwendung verursacht. 🎜 如果是某些业务需要持续的数据库操作,比如提交日志接口等,那么是可以考虑打开长连接的,记得设置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知识的学习。
Das obige ist der detaillierte Inhalt vonDie Vor- und Nachteile der PHP-Kapselung von PDO-Instanzen und langen PDO-Verbindungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen











PHP 8.4 bringt mehrere neue Funktionen, Sicherheitsverbesserungen und Leistungsverbesserungen mit einer beträchtlichen Menge an veralteten und entfernten Funktionen. In dieser Anleitung wird erklärt, wie Sie PHP 8.4 installieren oder auf PHP 8.4 auf Ubuntu, Debian oder deren Derivaten aktualisieren. Obwohl es möglich ist, PHP aus dem Quellcode zu kompilieren, ist die Installation aus einem APT-Repository wie unten erläutert oft schneller und sicherer, da diese Repositorys in Zukunft die neuesten Fehlerbehebungen und Sicherheitsupdates bereitstellen.

JWT ist ein offener Standard, der auf JSON basiert und zur sicheren Übertragung von Informationen zwischen Parteien verwendet wird, hauptsächlich für die Identitätsauthentifizierung und den Informationsaustausch. 1. JWT besteht aus drei Teilen: Header, Nutzlast und Signatur. 2. Das Arbeitsprinzip von JWT enthält drei Schritte: Generierung von JWT, Überprüfung von JWT und Parsingnayload. 3. Bei Verwendung von JWT zur Authentifizierung in PHP kann JWT generiert und überprüft werden, und die Funktionen und Berechtigungsinformationen der Benutzer können in die erweiterte Verwendung aufgenommen werden. 4. Häufige Fehler sind Signaturüberprüfungsfehler, Token -Ablauf und übergroße Nutzlast. Zu Debugging -Fähigkeiten gehört die Verwendung von Debugging -Tools und Protokollierung. 5. Leistungsoptimierung und Best Practices umfassen die Verwendung geeigneter Signaturalgorithmen, das Einstellen von Gültigkeitsperioden angemessen.

Dieses Tutorial zeigt, wie XML -Dokumente mit PHP effizient verarbeitet werden. XML (Extensible Markup-Sprache) ist eine vielseitige textbasierte Markup-Sprache, die sowohl für die Lesbarkeit des Menschen als auch für die Analyse von Maschinen entwickelt wurde. Es wird üblicherweise für die Datenspeicherung ein verwendet und wird häufig verwendet

Statische Bindung (statisch: :) implementiert die späte statische Bindung (LSB) in PHP, sodass das Aufrufen von Klassen in statischen Kontexten anstatt Klassen zu definieren. 1) Der Analyseprozess wird zur Laufzeit durchgeführt.

Eine Zeichenfolge ist eine Folge von Zeichen, einschließlich Buchstaben, Zahlen und Symbolen. In diesem Tutorial wird lernen, wie Sie die Anzahl der Vokale in einer bestimmten Zeichenfolge in PHP unter Verwendung verschiedener Methoden berechnen. Die Vokale auf Englisch sind a, e, i, o, u und sie können Großbuchstaben oder Kleinbuchstaben sein. Was ist ein Vokal? Vokale sind alphabetische Zeichen, die eine spezifische Aussprache darstellen. Es gibt fünf Vokale in Englisch, einschließlich Großbuchstaben und Kleinbuchstaben: a, e, ich, o, u Beispiel 1 Eingabe: String = "TutorialPoint" Ausgabe: 6 erklären Die Vokale in der String "TutorialPoint" sind u, o, i, a, o, ich. Insgesamt gibt es 6 Yuan

PHP und Python haben jeweils ihre eigenen Vorteile und wählen nach den Projektanforderungen. 1.PHP ist für die Webentwicklung geeignet, insbesondere für die schnelle Entwicklung und Wartung von Websites. 2. Python eignet sich für Datenwissenschaft, maschinelles Lernen und künstliche Intelligenz mit prägnanter Syntax und für Anfänger.

Was sind die magischen Methoden von PHP? Zu den magischen Methoden von PHP gehören: 1. \ _ \ _ Konstrukt, verwendet, um Objekte zu initialisieren; 2. \ _ \ _ Destruct, verwendet zur Reinigung von Ressourcen; 3. \ _ \ _ Call, behandeln Sie nicht existierende Methodenaufrufe; 4. \ _ \ _ GET, Implementieren Sie den dynamischen Attributzugriff; 5. \ _ \ _ Setzen Sie dynamische Attributeinstellungen. Diese Methoden werden in bestimmten Situationen automatisch aufgerufen, wodurch die Code -Flexibilität und -Effizienz verbessert werden.

PHP ist eine Skriptsprache, die auf der Serverseite weit verbreitet ist und insbesondere für die Webentwicklung geeignet ist. 1.PHP kann HTML einbetten, HTTP -Anforderungen und Antworten verarbeiten und eine Vielzahl von Datenbanken unterstützt. 2.PHP wird verwendet, um dynamische Webinhalte, Prozessformdaten, Zugriffsdatenbanken usw. mit starker Community -Unterstützung und Open -Source -Ressourcen zu generieren. 3. PHP ist eine interpretierte Sprache, und der Ausführungsprozess umfasst lexikalische Analyse, grammatikalische Analyse, Zusammenstellung und Ausführung. 4.PHP kann mit MySQL für erweiterte Anwendungen wie Benutzerregistrierungssysteme kombiniert werden. 5. Beim Debuggen von PHP können Sie Funktionen wie error_reporting () und var_dump () verwenden. 6. Optimieren Sie den PHP-Code, um Caching-Mechanismen zu verwenden, Datenbankabfragen zu optimieren und integrierte Funktionen zu verwenden. 7
