Как запретить запуск php-скрипта, если он уже работает?
Есть php скрипт, который запускается из браузера различными юзерами и может выполняться минут 20. Если запустить этот скрипт дважды (2 процесса одновременно), то результат получается печальный. Как контролировать, работает скрипт или нет? Как запретить запуск скрипта, если он уже работает?
На скорую руку написал в начале скрипта создание временного файла и запись туда еденицы (т.е. скрипт работает) (соответственно завершение скрипта, если файл уже есть и в нём стоит 1), а в конце скрипта удаление временного файла. Пока всё хорошо, но если скрипт будет прерван посередине, то временный файл будет жить вечно, т.ч. этот вариант плох
1. Использовать грамотные блокировки файлов - flock()
2. Использовать блокировки базы данных. (в MySql есть специальные функцие, точне не помню как называются, но что-то вроде SET_LOCK() и GET_LOCK())
3. Создавать временный каталог. Удобно тем, что функция mkdir возвращает ошибку, если каталог уже существует:
Код:
if (!mkdir("runfile",0755)) {print "процесс уже зарущен";exit;}
А что делать, если скрипт отвалился и блокировки не были сняты, временные файлы/каталоги не были удалены?
Почитал ман по flock: The lock is released also by fclose() (which is also called automatically when script finished)
получается предложение mike'а насчёт flock - оптимально
Safe Mode?...:rolleyes:
Опиши поподробнее
Возможно нужно модифицировать алгоритмы скрипта
Цитата: l0bSter
А что за скрипт собственно такой, который 20 минут работает
Опиши поподробнее
Возможно нужно модифицировать алгоритмы скрипта
Опиши поподробнее
Возможно нужно модифицировать алгоритмы скрипта
Скрипт просматривает определённые таблицы в определённых БД. Из нужных таблиц создаётся бинарный дамп (быстрее обычного дампа), архивируется, качается по ftp (реализовано CURL-ом) на другой сервер, там распаковывается и закачивается в БД.
Репликация MySQL-я не подходит.
Использование логов, создаваемых для репликации - оказалось не надёжно
Это если тебе пхп даст держать скрипт запущенным 20 минут.... :) По умолчанию = 30 сек, см. max_execution_time. Или мб разбить 1 скрипт на 3?
как решение - думать над реализацией...