锁定表上的PHP MySQLi超时?

锁定表上的PHP MySQLi超时?,php,timeout,locking,mysqli,Php,Timeout,Locking,Mysqli,我对mysqli超时选项有一个奇怪的问题,给你: 我使用mysqli_init()和real_connect()来设置mysqli_OPT_connect_超时 $this->__mysqli = mysqli_init(); if(!$this->__mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT,1)) throw new Exception('Timeout settings failed') $this->__mys

我对mysqli超时选项有一个奇怪的问题,给你:

我使用mysqli_init()和real_connect()来设置mysqli_OPT_connect_超时

$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 users WRITE)上启动查询,并将其挂起,忽略我的所有设置,甚至:

set_time_limit(1);
ini_set('max_execution_time',1);
ini_set('default_socket_timeout',1);
ini_set('mysql.connect_timeout',1);
我理解为什么设置时间限制(1)和最大执行时间被忽略,但为什么其他超时,特别是MYSQLI\u OPT\u CONNECT\u TIMEOUT被忽略,以及如何解决它

我在Windows和Linux设备上使用PHP 5.3.1,请提供帮助。

似乎在连接时配置超时:

连接时间ut以秒为单位 (在使用TCP/IP的Windows上受支持 从PHP 5.3.1开始)


这里,您正在尝试对锁定的表执行查询。。。这意味着你有一个需要很多时间的查询(比如永远);但是您已经连接到数据库

因此,应该配置的不是连接超时;但有些“查询超时”


不知道如何设置“查询超时”,不过

也许MYSQLI\u CLIENT\u INTERACTIVE的标志在某种程度上会有所帮助?

有。但顾名思义,它只适用于InnoDB表

InnoDB事务在放弃前可能等待行锁定的超时(以秒为单位)。默认值为50秒。尝试访问被另一个InnoDB事务锁定的行的事务在发出以下错误之前最多会挂起几秒钟:
错误1205(HY000):超过锁定等待超时;除了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有点过时


C.

这个锁的问题是它的内部mysql锁,我无法控制它……MYSQLI\u CLIENT\u INTERACTIVE是查询不活动时的空闲超时。这不是查询超时。