Запрет запуска двух процессов
а) выполняется долго
б) не должен выполнятся паралельно
в) запущен под игнор юзверь аборт и сет тайм лимит 0
Вот и стал вопрос как запретить запуск двух копий скрипта?
Реализовал через создание в конструкторе файла, который указывает что был запущен скрипт и удаление этого файла в деструкторе, но если некорректно завершится процесс деструктор по идее не сработает соответственно скрипт не запустится повторно даже если он выполнился не полностью
Может у кого есть идеи на этот счет?
Про демоны на compdoc.ru.
Про атомарное создание pid-файла на unixfaq.ru.
За степень родства описанного там с граблями не ручаюсь. =)
Как я понимаю в скрипте есть цыкл ? Если да то может так:
Гдето делаем ячейку с атомарным доступом (в той же БД например)
В цыкле раз в никогда (к примеру каждые 100 итерацый) обновляэм в нашей ячейке поточную дату. Експериментально устанавливаем примерное время для ентих вот 100 итерацый, додаем к нему большой запас и проверяем перед началом с SELECT FOR UPDATE.
После завершения не обнуляем ячейку так как пустое значение перед началом нам не подходит изза того же SELECT FOR UPDATE или UPDATE.
ЗЫ. ногами не пинать. Сам понимаю что криво, а лутше просто не умею.
не могу понять каким образом спасет pid-file?
Сперва создайте временный файл, содержащий pid, а потом попытайтесь слинковать его на место: link(2). Если pid-file уже существует, то link(2) вернет EEXIST, а если нет, то атомарно появится pid-file с уже готовым содержимым. Не забудьте удалить временный файл.
Или я чего то не понимаю, но смысл в этом, если при корректном завершении работы скрипта, он сам может удалить временный файл, а вот при некорректном файл останется
Содержимое файла меня интересует мало, само наличие семафора(файла в данном случае) уже говорит о том что скрипт запущен, но как добится удаления этого файла при любых ситуациях как то не могу понять ((
1. Выбирать pid из pid-файла и пытаться общаться с этим процессом средствами межпроцессного взаимодействия (как-нибудь ^_^). Если он правильно отвечает — значит наш клиент. =)
2. Вместо пид файла использовать unix-сокет.
Сперва создайте временный файл, содержащий pid, а потом попытайтесь слинковать его на место: link(2). Если pid-file уже существует, то link(2) вернет EEXIST, а если нет, то атомарно появится pid-file с уже готовым содержимым. Не забудьте удалить временный файл.
Или я чего то не понимаю, но смысл в этом, если при корректном завершении работы скрипта, он сам может удалить временный файл, а вот при некорректном файл останется
Содержимое файла меня интересует мало, само наличие семафора(файла в данном случае) уже говорит о том что скрипт запущен, но как добится удаления этого файла при любых ситуациях как то не могу понять ((
дык в pid файле лежит pid процесса, чекать, есть файл (дальше), есть процесс с таким pid (отбой)... нет процесса с таким pid но есть файл (перезаписываем pid в файл и дальше) :)
getmypid — Gets PHP's process ID
НО это ничего не дает )))) Запускаю скрипт, узнаю его pid и записываю в файл ))) а дальше что? ))) при повторном запуске скрипта, что это мне дало ну есть файл, pid не совпадает - значит можно выполняться, а на самом деле нельзя )) берем вариант когда функции exec недоступны.
Угу, не самый плохой вариант. Только подумай над ним в контексте nginx+php-fpm к примеру ;)
Может у кого есть идеи на этот счет?
Не понимаю, чего народ велосипеды изобретает. Есть же мьютексы, есть же симофоры...
Семафоры не доступны на хостинге ( Мьютексы тем более
нужен механизм использующий страндартные средства ПХП
echo time().'<br>';
$fp = fopen("test.txt", "w+");
if (flock($fp, LOCK_EX|LOCK_NB, $int)) { // выполнить эксплюзивное запирание
echo $int;
echo time().'<br>';
fwrite($fp, "Что-нибудь пишем111\n");
sleep(60);
flock($fp, LOCK_UN); // отпираем файл
} else {
echo "Не могу запереть файл !";
}
echo time().'<br>';
echo 'Done';
fclose($fp);
?>