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!
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.
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
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. sql
pdo
3. Sambungan panjang pdo
Dalam operasi, apabila menyambung ke pangkalan data, tambah satu lagi parameter:
$pdo = new PDO($dsn, $username, $passwd, [PDO::ATTR_PERSISTENT => true]);
ialah kaedah untuk membuka sambungan yang panjang. PDO::ATTR_PERSISTENT => true
, adakah ini benar? nginx
参考博文地址:https://www.cnblogs.com/wpjamer/articles/7106389.html
, 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
, sambungan yang panjang adalah tidak sah. Adakah sumber akan dikeluarkan apabila pelaksanaan skrip tamat? nginx
参考博文地址:https://hacpai.com/article/1526490593632
Fakta telah membuktikan bahawa boleh mencapai sambungan yang panjang, tetapi jika proses itu terbiar, ia akan menyebabkan pembaziran sumber. php-fpm
Fail konfigurasi
, yang mewakili bilangan maksimum perkhidmatan yang diminta untuk setiap sub-proses Jika nilai ini melebihi, sub-proses akan dimulakan semula secara automatik. php-fpm
pm.max_requests = 1000
Contohnya, jika parameter
, jadi ia adalah masalah pertimbangan dan kebijaksanaan tetapan permulaan max_requests
Jika diuji Tiada masalah seperti kebocoran memori, dan ia boleh menjadi lebih besar. 502
1000
4. Kesan sambungan yang lama pada urus niaga
参考博文地址:https://www.zhihu.com/question/62603122
Jika konkurensi perniagaan agak besar dan terdapat transaksi, tidak digalakkan untuk menggunakan sambungan panjang. 5 Ringkasan
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数据库连接池
首先这部分博主是参考了一个网友的封装,github
地址如下:
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; } } }
这步原因是长连接会频繁的造成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);}
/** * destruct 关闭数据库连接 */ public function destruct() { $this->pdo = null; }
public function query($sql = null, $param = null) { //检测连接是否活跃 $this->pdo_ping(); //判断之前是否有结果集 if (!empty($this->PDOStatement)) { $this->free(); } xxxxxxxxxx }
这四步完善之后,这个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!