Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > Проверка запуска экзепляра скрипта


Автор: DIAgen.G 3.3.2007, 12:23
Вот в чем пробема, есть скрипт, который запускается через каждые 30-90 минут через CRON, а возможно ли как-нибудь при помощи PHP при запуске скрипта проверить если он уже запущен, то просто делаем DIE(), если нет то тогда запускаем скрипт?

Автор: Всемогущий 3.3.2007, 12:39
 smile 

Автор: skyboy 3.3.2007, 12:58
для Windows-платформ такое недоступно, но есть в PHP http://www.php.net/sem.

Автор: DIAgen.G 3.3.2007, 13:05
Цитата(Всемогущий @ 3.3.2007,  10:39)
единственное что смог придумать:
либо создавать текстовый файлик 
либо нагадить в БД smile

Добавлено @ 12:40 
как Вас устроит?

Только вот только одно, если скрипт завершился критически он не успее не занести в базу или записать в файл даные! Может и ошибаюсь(((

Добавлено @ 13:15 
Еще, пропустил, этот скрипт должен все время весеть в памети, получается вроде сервиса должен быть!

Автор: skyboy 3.3.2007, 13:59
DIAgen.G, целевая платформа - *nix или Windows? если windows - то в модуле win32 есть функции, позволяющие создать сервис на основе php - скрипта. для *nix как создать демона - не знаю, скорее всего, такого нет в 5 версии.
Цитата(DIAgen.G @  3.3.2007,  12:05 Найти цитируемый пост)
Только вот только одно, если скрипт завершился критически он не успее не занести в базу или записать в файл даные!

для этого можно заюзать поле "последнее обращение", вроде timeout'a. ты же сам говоришь, что скрипт запускается через фиксированные промежутки времени. кроме того, можно сделать не просто проверку "тут какой-то флаг в БД установлен, значит, место занято", а записать в некую заранее определенную область(файл, опять же, или БД) некий запрос "ты ещё жив?" и если в timeout-промежуток придет ответ "да, не мешай"(опять же - в некую определенную заранее область - файл, БД, семафор), то второй экземпляр отключится. если же ответ не придет, то считаем первый процесс пропавшим без вести и начинаем свое черное дело smile зачем тогда флаг "дело идет" если все равно запросы подавать? а чтоб если точно никто не работает, не приходилось выжидать timeout. 

Автор: boombick 4.3.2007, 20:39
Цитата(skyboy @  3.3.2007,  14:59 Найти цитируемый пост)
ля *nix как создать демона - не знаю, скорее всего, такого нет в 5 версии.

да и лучше использовать для создания демона более приспособленные для этого языки и не забивать гвозди микроскопом

Автор: CyClon 14.4.2007, 12:43
Код
<?php

if (!file_exists('loaded.status')) {
    // ... создание файла loaded.status ...
    include('script.php'); // Наш скрипт
    //... удаление файла loaded.status ... 
}

?>


Вот такая вот идейка...

Автор: Jema 11.7.2007, 00:03
Все круто.... только если не произойдет по каким либо причинам 
//... удаление файла loaded.status ...
то что будем делать?

Автор: lorien 11.7.2007, 16:26
Очень просто, открываешь файл и лочишь его.
При следующем запуске проверяешь, если файл залочен, значит скрипт живой.

Автор: Fally 11.7.2007, 16:49
А может попробывать его popen()'ом? Если вернулся ресурс, тогда die(), если нет - пусть скрипт себе работает...

Автор: Golda 12.7.2007, 18:21
Если я правильно поняла, требуется, чтобы скрипт работал всегда в единственном экземпляре, а по завершении работы вызывался новый instance. Для Unix/Linux можно прописать его вызов в /etc/inittab с флагом respawn

Автор: lorien 14.7.2007, 11:45
Скорее всего человек хочет пускать скрипты на шаред хостинге, вряд ли там пров даст ему /etc/inittab править )

Автор: Diesel Draft 15.7.2007, 10:47
Извините, выше не читал. У меня идея.

При запуске скрипт можно убить свою запись крон, а на конце опять запустить. Вы точно будете знать что он не повторяется и запускается пере той самый промежуток времени. 

Автор: Golda 15.7.2007, 12:27
Ну, если речь идет о шаред хостинге и inittab и cron не подойдут. Тогда только какой-нибудь вариант lock

Добавлено через 51 секунду
shared memory и семафоры, думаю, стоит использовать. Для того и предназначены

Автор: -=Ustas=- 15.7.2007, 17:10
Цитата(Jema @  11.7.2007,  00:03 Найти цитируемый пост)
Все круто.... только если не произойдет по каким либо причинам 
//... удаление файла loaded.status ...
то что будем делать? 


Причина может быть только одна - фатальный вылет скрипта (если ты правильно все напишешь). Но при фатальном выпаде тебе даже и shared memory мало помогут. Поэтому можно флаг делать и на файле и на shared memory.

Автор: Golda 15.7.2007, 17:29
На случай таких единичных сбоев, стоит ориентироваться не на просто на сам факт существования lock, а на время его создания. И если это время превышает разумное, считать такой lock следствием сбоя и игнорировать

Автор: Diesel Draft 15.7.2007, 18:06
Также можно просто на початке робот создавать файл, а в конце его удалять. И каждый раз перевеять есть ли он

Автор: Diesel Draft 15.7.2007, 19:30
В файл писать можно каждую минуту, то есть чтоб данные актуальные оставались

Автор: lorien 15.7.2007, 23:03
Для слабослыщащих повторяю свой предыдущий пост: открываете и лочите файл, если процесс умрёт, то лок потеряется. 

Автор: Diesel Draft 16.7.2007, 01:19
lorien, а ты проверял?

Автор: CyClon 3.8.2007, 13:03
По сабжу - скрипт при запуске создает какой-либо файл, при окончании работы - удаляет его. В начале скрипта - if (file_exixts())...

Автор: Oflashp 3.8.2007, 15:17
Использую метод протоколирования. Запускается более сотни скриптов. Сбоев не было.

Автор: Anarki 5.8.2007, 17:03
lorien правильно сказал, так лучше всего делать.
Например:
Код

<?php
set_time_limit(0);
$a = time();
$fp = fopen('.lock', 'r+') or die('Cant open .lock!');
$f = flock($fp, LOCK_EX+LOCK_NB);
echo time()-$a; 
if (!$f) {
    fclose($fp);
    die("Already running\n");
}
$i = 0;
while($i<30) {
    ++$i;
    // что-то делаем
    echo "in cycle\n";
    sleep(1);
}
fclose($fp); # снимается блокировка
echo "ALL DONE\n";
?>

Только если под апачем запущен скрипт, то могут быть косяки.
Поэтому вообще долгоиграющие скрипты лучше из консоли запускать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)