Тайм-аут PHP MySQLi для заблокированных таблиц? - PullRequest
1 голос
/ 23 марта 2010

У меня странная проблема с параметрами тайм-аута 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 пишут), и она просто зависает, игнорируя все мои настройки даже:

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 и как их решить.

Я использую PHP 5.3.1 для Windows и Linux, пожалуйста, помогите.

Ответы [ 3 ]

0 голосов
/ 23 марта 2010

Есть innodb_lock_wait_timeout .Но, как следует из названия, это только для таблиц InnoDB.

Время ожидания в секундах, в течение которого транзакция InnoDB может ожидать блокировку строки, прежде чем отказаться.Значение по умолчанию составляет 50 секунд.Транзакция, которая пытается получить доступ к строке, заблокированной другой транзакцией InnoDB, будет зависать не более этого количества секунд, прежде чем выдать следующую ошибку: ОШИБКА 1205 (HY000): превышено время ожидания блокировки;попробуйте перезапустить транзакцию
0 голосов
/ 23 марта 2010

В дополнение к ответу Паскаля МАРТИНА:

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 немного странный.

С * * +1010

0 голосов
/ 23 марта 2010

MYSQLI_OPT_CONNECT_TIMEOUT, кажется, настраивает время ожидания во время соединения:

время соединения т в секундах (поддерживается в Windows с TCP / IP начиная с PHP 5.3.1)


Здесь вы пытаетесь выполнить запрос к заблокированной таблице ... Это означает, что у вас есть запрос, который занимает много времени (как навсегда) ; но вы уже подключены к базе данных .

Итак, что нужно настроить, это не тайм-аут соединения ; но некоторые " Тайм-аут запроса ".


Не уверен, как установить этот " тайм-аут запроса ", хотя ...

Может быть, флаг MYSQLI_CLIENT_INTERACTIVE для mysql_real_connect может помочь, так или иначе?

...