Синхронизация в php - PullRequest
       3

Синхронизация в php

1 голос
/ 19 апреля 2011

после прочтения:

Потоки и синхронизация PHP

мое предположение верно, что даже если у меня есть шаблон сингелтона, на самом деле есть 1 экземпляр этого классаза запрос?Как насчет flock?

Мне нужно ограничить определенный блок функций / кода в моем приложении, чтобы он выполнялся только одним запросом за раз.Причина немного странная, мне нужно вызвать инструмент cmd-line, который читает текстовый файл, который я создаю в php, а затем записывает результат в несколько текстовых файлов.Чтобы предотвратить ложные / странные результаты, весь файл кода блока создания - запуск команды cmd-line-read должен быть синхронизирован.

Как я могу это сделать?Я попробовал это с фиктивным файлом, заблокируйте его с помощью flock -> не работает.Я также попробовал простое логическое поле isLocked, чтобы остановить дальнейшее выполнение второго запроса.Также не работает.Проблема в том, что первый запрос обрабатывается правильно (данные вставляются в БД), а второй нет, и оба запроса не завершаются, страница загружается вечно.

Идеи?решения?

РЕДАКТИРОВАТЬ:

$lockFile = fopen("lock", "r");
while (!flock($lockFile, LOCK_EX)) {

    sleep(1000);
}
// do work
flock($lockFile, LOCK_UN);
fclose($lockFile);

Или:

if (myClass::$isLocked) {
  return false;
}
myClass::$isLocked = true
// do work
myClass::$isLocked = false

оба варианта не работают и оба запроса останавливаются, например.следующая страница никогда не загружается.Мне нужно убить процесс Apache.

1 Ответ

1 голос
/ 19 апреля 2011

Да, Apache обрабатывает запрос и затем движется дальше.Это означает, что если вы не добавите что-либо в сеанс, оно прекратит свое существование в конце запроса.

Если вы хотите заблокировать файлы, вы можете использовать flock (как вы указали): http://php.net/manual/en/function.flock.php

А если вы хотите управлять состоянием в БД, вы можете использовать транзакции (mysql link): http://dev.mysql.com/doc/refman/5.0/en/ansi-diff-transactions.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...