本篇文章為大家帶來了PHP中PHP封裝pdo的實例,以及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
的完美連接池的,在業務比較複雜的地方,還是謹慎試用長連接,每個連線都是1個線程,會造成大量的資源浪費。
如果是某些业务需要持续的数据库操作,比如提交日志接口等,那么是可以考虑打开长连接的,记得设置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知识的学习。
以上是php封裝pdo實例以及pdo長連線的優缺點的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本文比較了酸和基本數據庫模型,詳細介紹了它們的特徵和適當的用例。酸優先確定數據完整性和一致性,適合財務和電子商務應用程序,而基礎則側重於可用性和

本文討論了確保PHP文件上傳的確保,以防止諸如代碼注入之類的漏洞。它專注於文件類型驗證,安全存儲和錯誤處理以增強應用程序安全性。

本文討論了在PHP中實施API速率限制的策略,包括諸如令牌桶和漏水桶等算法,以及使用Symfony/Rate-limimiter之類的庫。它還涵蓋監視,動態調整速率限制和手

本文討論了使用password_hash和pyspasswify在PHP中使用密碼的好處。主要論點是,這些功能通過自動鹽,強大的哈希算法和SECH來增強密碼保護

本文討論了OWASP在PHP和緩解策略中的十大漏洞。關鍵問題包括注射,驗證損壞和XSS,並提供用於監視和保護PHP應用程序的推薦工具。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 Linux新版
SublimeText3 Linux最新版

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3漢化版
中文版,非常好用

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。