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: , , ,

Также рекомендую к прочтению:

4 Responses to “PHP транзакция”

  1. drumrock Says:

    Если в какой-то момент упадёт скрипт, создавший этот файл, транзакции больше никогда не отработают до ручного удаления файла. :-)

  2. Azazel Says:

    дельное замечания.. надо по mtime еще сверять тогда….
    итог: добавляем в конструкцию if еще одно условие :)

  3. isia Says:

    Ну вообщето нормально не по mtime смотреть а по индентификатору процесса. Записваешь в файл ИД процесса который его создает, а другие просто проверяют на существование такого процесса.

  4. Azazel Says:

    мы не знаем что породило транзакцию. но даже если считать что это была СУБД, то начать обработку может один процесс, а заканчивать совершенно другой (снова смотря на сложность задачи)

Leave a Reply

Введите следующие символы: