PHP транзакция
возможно сглупил написал нижеприведенный код, посему хочу развернуть небольшое обсуждение на тему хорошо/плохо.
Задача: выполнить скрипт, занимающий большой период времени (секунд 20 например).
Проблема: при нескольких обращениях к скрипту запускалось несколько раз это действие и в итоге процесс либо зависал, либо постоянно обрабатывал данные (например заполнение некой таблицы, которую брать в транзакцию нельзя было на уровне СУБД)
мое решение:
$fname = ROOT."/transaction.lock";
if (!file_exists($fname) || filemtime($fname) < time() - 10 * 60) {
@unlink($fname);
$fp = fopen($fname, "w+t");
fclose($fp);
chmod($fname, 0777);
//наши мега действия
unlink($fname);
}
жду фразы “велосипед” и нормального решения :)))
Tags: PHP, пример, СУБД, транзакции
Также рекомендую к прочтению:
Июнь 20th, 2007 at 16:07
Если в какой-то момент упадёт скрипт, создавший этот файл, транзакции больше никогда не отработают до ручного удаления файла.
Июнь 20th, 2007 at 16:14
дельное замечания.. надо по mtime еще сверять тогда….
итог: добавляем в конструкцию if еще одно условие
Июнь 26th, 2007 at 16:37
Ну вообщето нормально не по mtime смотреть а по индентификатору процесса. Записваешь в файл ИД процесса который его создает, а другие просто проверяют на существование такого процесса.
Июнь 26th, 2007 at 18:26
мы не знаем что породило транзакцию. но даже если считать что это была СУБД, то начать обработку может один процесс, а заканчивать совершенно другой (снова смотря на сложность задачи)