搜尋
首頁後端開發PHP問題php封裝pdo實例以及pdo長連線的優缺點

本篇文章為大家帶來了PHP中PHP封裝pdo的實例,以及pdo長連接的相關知識,長連接顧名思義就是一直保持連接,相對於平時的短連接,每次請求都會重新創建鏈接來說,長連接可以有效的減少創建的過程,可以更好的節省性能。希望對大家有幫助!

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错误,而这个错误是phpwarnings级别错误,try..catch根本就捕获不到,所以博主这里自定义错误处理函数来处理。

      这部分是转化phpwarnings错误为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中文網其他相關文章!

陳述
本文轉載於:CSDN。如有侵權,請聯絡admin@php.cn刪除
酸與基本數據庫:差異和何時使用。酸與基本數據庫:差異和何時使用。Mar 26, 2025 pm 04:19 PM

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

PHP安全文件上傳:防止與文件相關的漏洞。PHP安全文件上傳:防止與文件相關的漏洞。Mar 26, 2025 pm 04:18 PM

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

PHP輸入驗證:最佳實踐。PHP輸入驗證:最佳實踐。Mar 26, 2025 pm 04:17 PM

文章討論了PHP輸入驗證以增強安全性的最佳實踐,重點是使用內置功能,白名單方法和服務器端驗證等技術。

PHP API率限制:實施策略。PHP API率限制:實施策略。Mar 26, 2025 pm 04:16 PM

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

php密碼哈希:password_hash和password_verify。php密碼哈希:password_hash和password_verify。Mar 26, 2025 pm 04:15 PM

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

OWASP前10 php:描述並減輕常見漏洞。OWASP前10 php:描述並減輕常見漏洞。Mar 26, 2025 pm 04:13 PM

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

PHP XSS預防:如何預防XSS。PHP XSS預防:如何預防XSS。Mar 26, 2025 pm 04:12 PM

本文討論了防止PHP中XSS攻擊的策略,專注於輸入消毒,輸出編碼以及使用安全增強的庫和框架。

PHP接口與抽像類:何時使用。PHP接口與抽像類:何時使用。Mar 26, 2025 pm 04:11 PM

本文討論了PHP中接口和抽像類的使用,重點是何時使用。界面定義了無實施的合同,適用於無關類和多重繼承。摘要類提供常見功能

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

mPDF

mPDF

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

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

MantisBT

MantisBT

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

Safe Exam Browser

Safe Exam Browser

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