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

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)
![VMware Horizon Client ne peut pas être ouvert [Réparer]](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 vous aide à accéder facilement aux postes de travail virtuels. Cependant, l'infrastructure de bureau virtuel peut parfois rencontrer des problèmes de démarrage. Cet article décrit les solutions que vous pouvez adopter lorsque le client VMware Horizon ne parvient pas à démarrer correctement. Pourquoi mon client VMware Horizon ne s'ouvre-t-il pas ? Lors de la configuration de VDI, si le client VMWareHorizon n'est pas ouvert, une erreur peut se produire. Veuillez confirmer que votre administrateur informatique a fourni l'URL et les informations d'identification correctes. Si tout va bien, suivez les solutions mentionnées dans ce guide pour résoudre le problème. Réparer le client VMWareHorizon qui ne s'ouvre pas si VMW ne s'ouvre pas sur votre ordinateur Windows
![Le client VMware Horizon se bloque ou se bloque lors de la connexion [Réparer]](https://img.php.cn/upload/article/000/887/227/170942987315391.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
Lors de la connexion à un VDI à l'aide du client VMWareHorizon, nous pouvons rencontrer des situations où l'application se bloque lors de l'authentification ou la connexion se bloque. Cet article explorera ce problème et proposera des moyens de résoudre cette situation. Lorsque le client VMWareHorizon rencontre des problèmes de gel ou de connexion, vous pouvez prendre certaines mesures pour résoudre le problème. Réparer le client VMWareHorizon se bloque ou reste bloqué lors de la connexion Si le client VMWareHorizon se bloque ou ne parvient pas à se connecter sous Windows 11/10, appliquez les solutions mentionnées ci-dessous : Vérifiez la connexion réseau Redémarrez le client Horizon Vérifiez l'état du serveur Horizon Effacez le cache du client Réparer Ho

MQTT (MessageQueuingTelemetryTransport) est un protocole léger de transmission de messages couramment utilisé pour la communication entre les appareils IoT. PHP est un langage de programmation côté serveur couramment utilisé qui peut être utilisé pour développer des clients MQTT. Cet article présentera comment utiliser PHP pour développer un client MQTT et inclura le contenu suivant : Concepts de base du protocole MQTT Exemples de sélection et d'utilisation de la bibliothèque client PHPMQTT : Utilisation du client PHPMQTT pour publier et

Lorsque de nombreux amis téléchargent des fichiers, ils parcourent d'abord la page Web, puis les transfèrent vers le client pour les télécharger. Mais parfois, les utilisateurs rencontreront le problème que la page Web Baidu Netdisk ne peut pas démarrer le client. En réponse à ce problème, l'éditeur a préparé une solution pour vous permettre de résoudre le problème selon lequel la page Web Baidu Netdisk ne peut pas démarrer le client. Les amis dans le besoin peuvent s'y référer. Solution : 1. Peut-être que Baidu Netdisk n'est pas la dernière version. Ouvrez manuellement le client Baidu Netdisk, cliquez sur le bouton Paramètres dans le coin supérieur droit, puis cliquez sur Mise à niveau de la version. S'il n'y a pas de mise à jour, l'invite suivante apparaîtra. S'il y a une mise à jour, veuillez suivre les invites pour mettre à jour. 2. Le programme du service de détection de Baidu Cloud Disk peut être désactivé. Il est possible que nous utilisions manuellement ou utilisions un logiciel de sécurité pour désactiver automatiquement le programme du service de détection de Baidu Cloud Disk. Vérifie s'il te plaît

Un client mobile fait référence à une application qui s'exécute sur un smartphone et offre aux utilisateurs diverses fonctions et services sous la forme d'un client natif ou d'un client Web. Les clients mobiles peuvent être divisés en deux formes : les clients originaux et les clients Web font référence à des applications écrites pour des systèmes d'exploitation spécifiques utilisant des langages de programmation et des outils de développement spécifiques. L'avantage des clients Web est qu'ils ont une bonne compatibilité multiplateforme. , peut s'exécuter sur différents appareils sans restrictions du système d'exploitation, mais par rapport au client natif, les performances et l'expérience utilisateur du client Web peuvent être réduites.

Comment écrire un client FTP en PHP 1. Introduction FTP (File Transfer Protocol) est un protocole utilisé pour le transfert de fichiers sur le réseau. Dans le développement Web, nous devons souvent télécharger ou télécharger des fichiers via FTP. En tant que langage côté serveur populaire, PHP fournit de puissantes fonctions FTP, nous permettant d'écrire facilement des clients FTP. Cet article explique comment écrire un client FTP simple en utilisant PHP et fournit des exemples de code. 2. Connectez-vous au serveur FTP en PHP, nous pouvons utiliser f

Certains utilisateurs de Win11 ont remarqué que le logo du bouclier apparaît à côté de certaines icônes de logiciels sur leurs ordinateurs personnels. Cela protège les systèmes informatiques et même les informations et données importantes qui y sont stockées contre toute violation. Si vous ne l'aimez pas, vous pouvez le résoudre par la méthode suivante. Comment supprimer le logo du bouclier sur le client Win11 1. Cliquez avec le bouton droit sur la barre des tâches de l'ordinateur et sélectionnez "Gestionnaire des tâches" 2. Cliquez ensuite sur "Démarrer" ci-dessus 3. Recherchez "Windows Defender" ici, faites un clic droit et sélectionnez "Désactiver". ", puis redémarrez simplement l'ordinateur.

Si ni le client ni le serveur n'implémentent la technologie de cryptage SSL, il est très facile que des informations soient volées par des attaquants intermédiaires pendant le processus de transmission, entraînant ainsi de graves risques pour la sécurité des données. Pour cette raison, des mesures correspondantes doivent être prises de toute urgence pour garantir efficacement la sécurité des données sensibles. Vous pouvez vous référer aux méthodes suivantes pour fonctionner. Le client et le serveur win11 ne prennent pas en charge le SSL1 couramment utilisé lors de la mise à niveau et de la transformation du système serveur, vous pouvez donner la priorité à la mise à niveau et à l'optimisation du système serveur, ou à l'ajout des composants nécessaires pour garantir qu'il puisse prendre en charge en douceur le dernier protocole SSL. . 2. Déployer des certificats SSL Vous pouvez acheter et déployer des certificats SSL émis par des centres de certification prestigieux et les installer sur le serveur pour réaliser cette fonction. 3. Activez le protocole SSL
