Медленный ответ на запись в базу данных из php

У меня есть PHP-скрипты, работающие на сервере WAMP. Вот что я делаю

  1. PHP-скрипт A, который запрашивает базу данных и получает набор строк (я установил set_time_limit (0) // неограниченное время для выполнения скрипта)
  2. На основе набора результатов я выполняю сценарий tcl для каждой строки набора результатов.
  3. Сценарий TCL выполняется около минуты, он также вставляет некоторые данные в ту же базу данных.
  4. Теперь одновременно с выполнением сценария TCL, если я выполняю другой сценарий PHP, который записывает данные в базу данных, я не могу этого сделать, поскольку время отклика слишком медленное. Фактически он ожидает завершения PHP-скрипта A/TCL-скрипта.
  5. Однако в это время чтение из базы данных происходит быстро и хорошо.

У кого-нибудь есть предложения?

С уважением, Митхун


person Vidya    schedule 22.08.2009    source источник
comment
Какой движок вы используете для этих таблиц? Работают ли какие-либо из рассматриваемых сценариев с транзакциями?   -  person Noah Goodrich    schedule 22.08.2009
comment
Если вы используете таблицы myisam, mysql блокирует всю таблицу, пока происходит запись в таблицу. Вы, вероятно, выполняете какие-то длительные операторы обновления или вставки или иным образом явно блокируете таблицу в коде. Или вы используете innodb и имеете длительные транзакции.   -  person nos    schedule 22.08.2009
comment
@nos, ты должен был сделать это как ответ, скорее всего, в этом причина.   -  person vava    schedule 22.08.2009
comment
Я использую движок MyIsam. Я думаю, проблема в том, что TCL требует времени для выполнения. даже если я не пишу в базу данных из TCL. Сценарий PHP ожидает завершения TCL перед записью в базу данных. Обратите внимание, что я использую PHP exec() для вызова скрипта TCL. и это в цикле строк, извлеченных из базы данных. т. е. я вызываю сценарий TCL около 7 раз (для 7 строк — просто, например).   -  person Vidya    schedule 22.08.2009
comment
Если вы используете exec, конечно, php ждет, пока он не завершится, это то, что делает exec.   -  person nos    schedule 22.08.2009
comment
Хорошо, я отладил больше. Я обращаюсь к переменной сеанса в начале PHP-скрипта A. Из-за этого он становится медленным. Если я удалю переменную сеанса, другой PHP-скрипт сможет записывать в базу данных, пока выполняется TCL-скрипт. Любые мысли, почему это происходит?   -  person Vidya    schedule 22.08.2009


Ответы (1)


Сессия не может быть разделена параллельными сценариями. Любые новые запросы, пытающиеся выполнить session_start(), будут зависать в этот момент в ожидании завершения предыдущего сценария.

Поскольку вашему скрипту требуется неопределенное время для завершения, хорошей идеей будет session_write_close() сразу после получения всей необходимой информации из суперглобала $_SESSION, чтобы параллельные запросы больше не зависали.

person Havenard    schedule 23.08.2009