锁定表上的PHP MySQLi超时?

时间:2010-03-23 11:54:44

标签: php timeout locking mysqli

我有一个奇怪的问题,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,请帮助。

3 个答案:

答案 0 :(得分:0)

MYSQLI_OPT_CONNECT_TIMEOUT似乎在连接时配置超时:

  

连接timeou 以秒为单位   (在Windows上使用TCP / IP支持   自PHP 5.3.1起)


在这里,您尝试在锁定的表上执行查询...这意味着您的查询需要花费大量时间(如永远);但您已连接到数据库

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


不知道如何设置“查询超时”,但是......

mysql_real_connectMYSQLI_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有点麻烦。

下进行。