PHP访问MySQL查询超时处理的方法_MySQL
bitsCN.com
目前两个客户端扩展库连接超时可以设置选项来操作,比如mysqli:
//创建对象
$mysqli = mysqli_init();
//设置超时选项
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5);
//连接
$mysqli->real_connect('localhost', 'my_user', 'my_password', 'world');
//如果超时或者其他连接失败打印错误信息
if (mysqli_connect_errno()) {
printf("Connect failed: %s/n", mysqli_connect_error());
exit();
}
//成功输出连接信息
printf ("Connection: %s/n.", $mysqli->host_info);
$mysqli->close();
?>
这个是连接超时,但是有些时候我们需要查询读写超时,比如说我们一个数据库压力很大,或者连接很多,那么数据库查询就很缓慢,但是我希望某些不重要的数据,比如说文章点击数这种如果查询超时了就不显示,至少能够保证主体页面正确显示,但是查遍PHP手册没有发现这个操作选项或者函数。
手册里只有这么四个选项
跟踪 mysqli 的扩展源代码发现它底层调用的是 libmysqlclient 的 mysql_options:
php-5.2.8/ext/mysqli/mysqli_api.c
并且在mysqli的PHP扩展中就只导出了几个变量:
php-5.2.8/ext/mysqli/mysqli.c
大概看了一下 libmysqlclient 的代码,发现其实它自带是有读写超时设置的:
mysql-5.1.30/sql-common/client.c
因为它自己定义了很多操作选项,只是php扩展里没有:
mysql-5.1.30/include/mysql.h
看看mysql中的读写超时是如何实现的:
mysql-5.1.30/sql-common/client.c
读写超时真正操作的地方,超时处理这里重试了两次,还是写死了:
mysql-5.1.30/sql/net_serv.cc
现在基本得出了结论:
按照上面查看代码来看,目前PHP针对MySQL查询超时以下限制:
1. 超时设置单位为秒,最少配置1秒
2. 但mysql底层的read会重试两次,所以实际会是 3 秒
重试两次 + 自身一次 = 3倍超时时间。
那么就是说最少超时时间是3秒,不会低于这个值,对于大部分应用来说可以接受,但是对于小部分应用需要优化。
现在我们来看看如果我们自己要设置超时,我们自己压入 MYSQL_OPT_READ_TIMEOUT 也是可以达到读写超时效果的,写一段代码来测试一下:
//自己定义读写超时常量
if (!defined('MYSQL_OPT_READ_TIMEOUT')) {
define('MYSQL_OPT_READ_TIMEOUT', 11);
}
if (!defined('MYSQL_OPT_WRITE_TIMEOUT')) {
define('MYSQL_OPT_WRITE_TIMEOUT', 12);
}
//设置超时
$mysqli = mysqli_init();
$mysqli->options(MYSQL_OPT_READ_TIMEOUT, 3);
$mysqli->options(MYSQL_OPT_WRITE_TIMEOUT, 1);
//连接数据库
$mysqli->real_connect("localhost", "root", "root", "test");
if (mysqli_connect_errno()) {
printf("Connect failed: %s/n", mysqli_connect_error());
exit();
}
//执行查询 sleep 1秒不超时
printf("Host information: %s/n", $mysqli->host_info);
if (!($res=$mysqli->query('select sleep(1)'))) {
echo "query1 error: ". $mysqli->error ."/n";
} else {
echo "Query1: query success/n";
}
//执行查询 sleep 9秒会超时
if (!($res=$mysqli->query('select sleep(9)'))) {
echo "query2 error: ". $mysqli->error ."/n";
} else {
echo "Query2: query success/n";
}
$mysqli->close();
echo "close mysql connection/n";
?>
查看上面代码的执行结果,验证了上面的观点,第一个查询成功了,第二个查询连接被断开了:
如果需要修改这个秒级别的超时,比如改成毫秒级别的超时,只能两个地方修改:
1. 修改客户端,比如 mysqli 的 query 代码,加入定时器,超时则返回
2. 修改 Mysql 中的vio代码,因为mysql的网络处理底层都是经过vio的操作
MySQL相关的vio代码:
poll 超时:
setsockopt 超时:
基本上到这里就基本能够解决PHP在针对MySQL读写查询操作超时的处理了,希望对你有帮助。
heiyeluren的blog

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

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

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)
![VMware Horizon Client無法開啟[已修復]](https://img.php.cn/upload/article/000/887/227/170835607042441.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
VMwareHorizon用戶端可協助您便利地存取虛擬桌面。然而,有時虛擬桌面基礎架構可能會遇到啟動問題。本文將討論當VMwareHorizon客戶端未能成功啟動時,您可以採取的解決方法。為什麼我的VMwareHorizon客戶端無法開啟?在設定VDI時,如果未開啟VMWareHorizon客戶端,可能會發生錯誤。請確認您的IT管理員提供了正確的URL和憑證。如果一切正常,請按照本指南中提到的解決方案解決問題。修復未開啟的VMWareHorizon用戶端如果您的Windows電腦上未開啟VMW
![VMware Horizon客戶端在連線時凍結或停滯[修復]](https://img.php.cn/upload/article/000/887/227/170942987315391.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
在使用VMWareHorizon用戶端連線到VDI時,我們可能會遇到應用程式在驗證過程中凍結或連線阻塞的情況。本文將探討這個問題,並提供解決這種情況的方法。當VMWareHorizon用戶端出現凍結或連線問題時,您可以採取一些措施來解決這個問題。修復VMWareHorizon用戶端在連接時凍結或卡住如果VMWareHorizon客戶端在Windows11/10上凍結或無法連接,請執行下面提到的解決方案:檢查網路連接重新啟動Horizon用戶端檢查Horizon伺服器狀態清除客戶端緩存修復Ho

MQTT(MessageQueuingTelemetryTransport)是一種輕量級的訊息傳輸協議,通常用於物聯網設備之間的通訊。 PHP是一種常用的伺服器端程式語言,可以用來開發MQTT客戶端。本文將介紹如何使用PHP開發MQTT客戶端,並包含以下內容:MQTT協定的基本概念PHPMQTT客戶端程式庫的選取和使用實例:使用PHPMQTT客戶端發布和

手機用戶端是指一種在智慧型手機上運行的應用程序,透過原生客戶端或Web客戶端的形式為用戶提供各種功能和服務。手機用戶端可以分為原始客戶端和Web客戶端兩種形式,原生客戶端是指使用特定程式語言和開發工具,為特定的作業系統編寫的應用程序,Web客戶端的優勢在於跨平台相容性好,可以不受作業系統限制在不同裝置上運行,但相對於原生客戶端,Web客戶端的效能和使用者體驗可能會降低。

許多朋友下載檔案會先在網頁上瀏覽,然後轉入客戶端下載。但有時使用者會遇到百度網盤網頁無法啟動客戶端的問題。針對這個問題,小編為大家準備了百度網盤網頁無法啟動客戶端的解決辦法,有需要的小夥伴可以參考一下哦。 解決方法 1、可能百度網盤不是最新版,手動打開百度網盤客戶端,點擊右上角的設定按鈕,再點擊版本升級。 如無更新,則會有以下提示,若有更新,請依照提示進行更新。 2、可能禁用了百度網盤的檢測服務程序 有可能使我們自己手動或使用安全軟體自動禁用了百度網盤的檢測服務程序。 請查看一下

如何在PHP中編寫FTP客戶端一、引言FTP(檔案傳輸協定)是一種用於在網路上進行檔案傳輸的協定。在Web開發中,我們常常需要透過FTP來上傳或下載檔案。 PHP作為一種流行的伺服器端語言,提供了強大的FTP功能,使我們可以輕鬆編寫FTP客戶端。本文將介紹如何使用PHP編寫一個簡單的FTP客戶端,並提供程式碼範例。二、連接FTP伺服器在PHP中,我們可以使用f

部分Win11使用者察覺他們的個人電腦中出現了一些軟體圖示旁出現防盾標誌的現象。透過此舉保障電腦系統乃至其中儲存的重要資訊和資料免受侵害。如果你不喜歡的話,那麼可以透過下面的方法來解決。 win11客戶端上面的盾牌標誌怎麼移除1、右鍵電腦上的任務欄,然後選擇“任務管理器”2、再點擊上面的“啟動”3、在這裡找到“Windowsdefender”然後右鍵選擇“禁止”,然後重啟電腦就可以了。

若客戶端與伺服器均未實現SSL加密技術,極易造成資訊在傳播過程中遭受中間攻擊者的竊取,進而引發嚴重危害資料安全之隱患。為此,應緊急採取相應措施以有效保障敏感資料安全,可以參考下面的方法來進行操作。 win11客戶端和伺服器不支援常用的ssl1、對伺服器系統進行升級改造可以優先考慮對伺服器系統進行升級與最佳化,或補充所需的必要元件,以確保其能夠順利地支援最新的SSL協定。 2、部署SSL證書您可以選購以及部署那些享有盛譽的認證中心發布的SSL證書,將其安裝於伺服器內即可實現此功能。 3.開啟SSL協議
