我有一个奇怪的问题,mysqli超时选项,你去:
我正在使用mysqli_init()和real_connect()来设置MYSQLI_OPT_CONNECT_TIMEOUT
$this->__mysqli = mysqli_init();
if(!$this->__mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT,1))
throw new Exception('Timeout settings failed')
$this->__mysqli->real_connect(host,user,pass,db);
....
然后我在锁定表(LOCKE TABLE用户WRITE)上启动查询并且它只是挂起,甚至忽略了我的所有设置:
set_time_limit(1);
ini_set('max_execution_time',1);
ini_set('default_socket_timeout',1);
ini_set('mysql.connect_timeout',1);
我理解为什么忽略set_time_limit(1)和max_execution_time但为什么忽略其他超时,特别是MYSQLI_OPT_CONNECT_TIMEOUT以及如何解决它。
我在Windows和Linux机器上使用PHP 5.3.1,请帮助。
答案 0 :(得分:0)
MYSQLI_OPT_CONNECT_TIMEOUT
似乎在连接时配置超时:
连接timeou 以秒为单位 (在Windows上使用TCP / IP支持 自PHP 5.3.1起)
在这里,您尝试在锁定的表上执行查询...这意味着您的查询需要花费大量时间(如永远);但您已连接到数据库。
那么,应该配置的不是连接超时;但有些“查询超时”。
不知道如何设置“查询超时”,但是......
mysql_real_connect
的MYSQLI_CLIENT_INTERACTIVE
标志可能会以某种方式提供帮助吗?
答案 1 :(得分:0)
有innodb_lock_wait_timeout。但顾名思义,这只适用于InnoDB表。
InnoDB事务在放弃之前可能等待行锁定的超时(以秒为单位)。默认值为50秒。尝试访问由另一个InnoDB事务锁定的行的事务将在发出以下错误之前最多挂起这么多秒: ERROR 1205(HY000):超出锁定等待超时;尝试重启事务
答案 2 :(得分:0)
除了Pascal MARTIN的回答:
PHP正在睡眠,直到查询完成 - 因此忽略了为PHP配置的任何内容。如果查询确实返回,则PHP将唤醒并继续处理 - 此时它将意识到它已经耗尽执行时间并突然结束 - 它是否会释放它已获取的锁定?也许
一种解决方案是实现自己的锁定模式,例如
$qry="UPDATE mydb.mylocks SET user='$pid' WHERE tablename='$table_to_lock' AND user IS NULL";
$basetime=time();
$nottimedout=5;
do {
mysql_query($qry);
$locked=mysql_affected_rows();
if (!$locked && $nottimedout--) sleep(1);
} while (!$locked && $nottimedout);
if ($nottimedout) {
// do stuff here
}
mysql_qry("UPDATE mydb.mylocks SET user=NULL WHERE tablename='$table_to_lock' AND user='$pid'";
我想一个更简洁的解决方案是将其作为表上的触发器实现 - 但我的MySQL PL / SQL有点麻烦。
下进行。