Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Kelebihan dan kekurangan php merangkum contoh pdo dan sambungan panjang pdo

Kelebihan dan kekurangan php merangkum contoh pdo dan sambungan panjang pdo

WBOY
WBOYke hadapan
2021-12-20 17:18:482809semak imbas

Artikel ini membawakan kepada anda contoh enkapsulasi PHP pdo dalam PHP, serta pengetahuan yang berkaitan tentang sambungan panjang pdo Seperti namanya, sambungan panjang sentiasa mengekalkan sambungan Berbanding dengan sambungan pendek biasa, pautan akan dibuat semula -dicipta dengan setiap permintaan Dikatakan bahawa sambungan yang panjang dapat mengurangkan proses penciptaan dan menjimatkan prestasi dengan lebih baik. Semoga ia membantu semua orang!

Kelebihan dan kekurangan php merangkum contoh pdo dan sambungan panjang pdo

1. Prakata

Baru-baru ini saya perlu menulis skrip untuk merealisasikan penyimpanan log ranap sistem, jadi okay, Kami hanya boleh merangkum sendiri operasi berkaitan pangkalan data. Blogger di sini memilih untuk merangkum pdo operasi yang berkaitan dengan pangkalan data.

2. Mengapa memilih pdo

Seperti yang kita sedia maklum, php mempunyai mysql sambungan pada masa awal, tetapi kemudiannya ia kehilangan ciri baharu mysql kerana ia terlalu lama. Oleh itu kemerosotan kunci utama.

Bermula dari php5, anda disyorkan untuk menggunakan sambungan mysqli Ini ialah versi dipertingkatkan bagi sambungan mysql Ia adalah antara muka berorientasikan objek dan lebih mudah guna. Kelemahannya ialah ia hanya boleh beroperasi MySQL dan tidak cukup berkuasa. mysql

Terdapat juga sambungan

Ini adalah sambungan terkaya dan menyokong pelbagai pangkalan data Yang penting ia lebih kuat daripada dua sambungan lain dari segi keselamatan Prapemprosesan adalah lebih berkesan dalam mencegah suntikan pdo. Oleh itu, penulis blog di sini memilih untuk merangkum prepared operasi berkaitan. sqlpdo3. Sambungan panjang pdo

1. Apakah sambungan pdo yang panjang

Seperti namanya, sambungan panjang bermaksud mengekalkan sambungan sepanjang masa sambungan pendek biasa, setiap permintaan Dari segi mencipta semula pautan, sambungan panjang boleh mengurangkan proses penciptaan dan menjimatkan prestasi dengan berkesan.

Dalam operasi, apabila menyambung ke pangkalan data, tambah satu lagi parameter:

$pdo = new PDO($dsn, $username, $passwd, [PDO::ATTR_PERSISTENT => true]);
selepas

ialah kaedah untuk membuka sambungan yang panjang. PDO::ATTR_PERSISTENT => true

2. Adakah sambungan panjang tidak sah untuk nginx

Apabila blogger sedang mencari pengetahuan tentang sambungan panjang, dia melihat satu artikel dan membuat kesimpulan bahawa sambungan panjang hanya digunakan untuk apache dan bukan untuk

, adakah ini benar? nginx

参考博文地址:https://www.cnblogs.com/wpjamer/articles/7106389.html
Kesimpulan umum ialah: sambungan panjang lebih disasarkan pada

, kerana apache mengekalkan kumpulan proses Selepas fungsi apache dihidupkan, apache mpm akan mengekalkan satu demi satu lalai Dalam kumpulan proses, sambungan selepas apache sambungan panjang tidak ditutup sebagai sambungan mysql, tetapi dimasukkan ke dalam kumpulan proses/benang sebagai sesuatu yang tidak dikeluarkan. socet

Dan untuk

, sambungan yang panjang adalah tidak sah. Adakah sumber akan dikeluarkan apabila pelaksanaan skrip tamat? nginx

3. Ujian sambungan panjang di bawah php-fpm

Senior sudah mengujinya di sini >

参考博文地址:https://hacpai.com/article/1526490593632
Kesimpulan:

Fakta telah membuktikan bahawa boleh mencapai sambungan yang panjang, tetapi jika proses itu terbiar, ia akan menyebabkan pembaziran sumber.
php-fpm Fail konfigurasi

boleh mempertimbangkan tetapan

, yang mewakili bilangan maksimum perkhidmatan yang diminta untuk setiap sub-proses Jika nilai ini melebihi, sub-proses akan dimulakan semula secara automatik. php-fpmpm.max_requests = 1000 Contohnya, jika parameter

ditetapkan kepada nilai yang sangat besar, proses anak perlu dijalankan berkali-kali sebelum dimulakan semula Jika ralat berlaku dalam permintaan ini atau kebocoran memori berlaku, maka ia adalah tidak sesuai untuk menetapkan nilai ini kepada nilai yang sangat besar. Tetapi jika tiada masalah dengan permintaan, jika nilai ini ditetapkan kepada nilai yang kecil, ia akan dimulakan semula dengan kerap, yang juga akan menghadapi banyak masalah

, jadi ia adalah masalah pertimbangan dan kebijaksanaan tetapan permulaan max_requests Jika diuji Tiada masalah seperti kebocoran memori, dan ia boleh menjadi lebih besar. 50210004. Kesan sambungan yang lama pada urus niaga

参考博文地址:https://www.zhihu.com/question/62603122
Ringkasan:

Jika konkurensi perniagaan agak besar dan terdapat transaksi, tidak digalakkan untuk menggunakan sambungan panjang. 5 Ringkasan

Semasa carian berterusan, penulis blog mendapati bahawa untuk mencapai prestasi terbaik sambungan panjang, pengumpulan sambungan tidak boleh dielakkan, dan PHP tidak begitu mahir dalam hal itu. Pelaksanaan connection pool memang agak dikesali.

Secara umumnya, adalah mustahil untuk mengkonfigurasi kumpulan sambungan yang sempurna dengan

dalam

Di tempat yang perniagaannya lebih kompleks, adalah lebih baik untuk mencuba sambungan yang panjang dengan berhati-hati 1 benang. Ia akan menyebabkan banyak pembaziran sumber. php

      如果是某些业务需要持续的数据库操作,比如提交日志接口等,那么是可以考虑打开长连接的,记得设置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知识的学习。

Atas ialah kandungan terperinci Kelebihan dan kekurangan php merangkum contoh pdo dan sambungan panjang pdo. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:csdn.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam