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 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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)
VMware Horizon Client を使用すると、仮想デスクトップに簡単にアクセスできます。ただし、場合によっては、仮想デスクトップ インフラストラクチャで起動の問題が発生することがあります。この記事では、VMware Horizon クライアントが正常に起動できない場合に実行できる解決策について説明します。 VMware Horizon クライアントが開かないのはなぜですか? VDI を構成するときに、VMWareHorizon クライアントが開いていないと、エラーが発生する可能性があります。 IT 管理者が正しい URL と資格情報を提供していることを確認してください。すべて問題がない場合は、このガイドに記載されている解決策に従って問題を解決してください。 Windows コンピュータで VMW が開かない場合に VMWareHorizon Client が開かない問題を修正する
![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 クライアントが接続中にフリーズするかスタックする問題を修正する Windows 11/10 で VMWareHorizon クライアントがフリーズするか接続に失敗する場合は、以下の解決策に従ってください。 ネットワーク接続を確認する Horizon クライアントを再起動する Horizon サーバのステータスを確認する クライアント キャッシュをクリアする 修正方法

MQTT (MessageQueuingTelemetryTransport) は、IoT デバイス間の通信に一般的に使用される軽量のメッセージ送信プロトコルです。 PHP は、MQTT クライアントの開発に使用できる、一般的に使用されるサーバー側プログラミング言語です。この記事では、PHP を使用して MQTT クライアントを開発する方法を紹介します。以下の内容が含まれます。 MQTT プロトコルの基本概念 PHPMQTT クライアント ライブラリの選択と使用例: PHPMQTT クライアントを使用した公開と使用

多くの友人がファイルをダウンロードする場合、最初に Web ページを閲覧し、次にクライアントに転送してダウンロードします。ただし、Baidu Netdisk Web ページでクライアントを起動できないという問題が発生することがあります。この問題に対応して、編集者は百度ネットディスク Web ページでクライアントを起動できない問題を解決するための解決策を用意しましたので、困っている友人は参照してください。解決策: 1. Baidu Netdisk が最新バージョンではない可能性があります。Baidu Netdisk クライアントを手動で開き、右上隅の設定ボタンをクリックし、バージョン アップグレードをクリックします。アップデートがない場合は以下の画面が表示されますが、アップデートがある場合は画面に従ってアップデートしてください。 2. Baidu Cloud Disk の検出サービス プログラムが無効になっている可能性があります当社が手動またはセキュリティ ソフトウェアを使用して、Baidu Cloud Disk の検出サービス プログラムを自動的に無効にする可能性があります。チェックアウトしてください

モバイルクライアントとは、スマートフォン上で動作し、ネイティブクライアントやWebクライアントの形でユーザーにさまざまな機能やサービスを提供するアプリケーションを指します。モバイル クライアントは、オリジナル クライアントと Web クライアントの 2 つの形式に分けることができます。ネイティブ クライアントは、特定のプログラミング言語と開発ツールを使用して、特定のオペレーティング システム用に作成されたアプリケーションを指します。Web クライアントの利点は、優れたクロスプラットフォーム互換性があることです。 、オペレーティング システムの制限なしでさまざまなデバイス上で実行できますが、ネイティブ クライアントと比較して、Web クライアントのパフォーマンスとユーザー エクスペリエンスが低下する可能性があります。

PHP で FTP クライアントを作成する方法 1. はじめに FTP (File Transfer Protocol) は、ネットワーク上でのファイル転送に使用されるプロトコルです。 Web 開発では、FTP 経由でファイルをアップロードまたはダウンロードする必要があることがよくあります。人気のあるサーバーサイド言語として、PHP は強力な FTP 機能を提供し、FTP クライアントを簡単に作成できるようにします。この記事では、PHP を使用して単純な FTP クライアントを作成する方法とコード例を紹介します。 2. PHP で FTP サーバーに接続します。f を使用できます。

一部の Win11 ユーザーは、パーソナル コンピューター上の一部のソフトウェア アイコンの横に盾のロゴが表示されることに気づいています。これにより、コンピュータ システムだけでなく、そこに保存されている重要な情報やデータも侵害から保護されます。それが気に入らない場合は、次の方法で解決できます。 win11クライアントでシールドロゴを削除する方法 1. コンピューターのタスクバーを右クリックし、「タスクマネージャー」を選択します。 2. 次に、上の「スタート」をクリックします。 3. ここで「Windows Defender」を見つけ、右クリックして「無効にする」を選択します。 」と表示されたら、コンピューターを再起動するだけです。

クライアントもサーバーも SSL 暗号化テクノロジを実装していない場合、送信プロセス中に情報が仲介攻撃者によって簡単に盗まれ、データ セキュリティに重大なリスクが発生します。このため、機密データのセキュリティを効果的に確保するには、対応する措置を早急に講じる必要があり、以下の方法を参照して運用することができます。 win11 クライアントおよびサーバーは、一般的に使用されている SSL1 をサポートしていません。サーバー システムをアップグレードおよび変更する場合は、最新の SSL プロトコルをスムーズにサポートできるように、サーバー システムのアップグレードと最適化、または必要なコンポーネントの追加を優先することができます。 。 2. SSL 証明書の展開 権威ある認証センターが発行した SSL 証明書を購入して展開し、サーバーにインストールしてこの機能を実現できます。 3. SSLプロトコルを有効にする
