|
|
|
| Здравствуйте!
есть скрипт, который нужно, чтобы работал постоянно, а когда завершит поставленную задачу - запускался снова.
допустим вешаем на крон - запускать каждую минуту
в самом скрипте вот такое:
<?php
set_time_limit(0);
ignore_user_abort(1);
class Thread {
function RegisterPID($pidFile) {
if ($fp = fopen($pidFile, 'w')) {
fwrite($fp, getmypid());
fclose($fp);
@chmod($pidFile, 0777);
return true;
}
return false;
}
function CheckPIDExistance($pidFile) {
if ($PID = @file_get_contents($pidFile)) {
if (posix_kill($PID, 0))
return true;
}
return false;
}
function KillPid($pidFile) {
if ($PID = @file_get_contents($PIDFile))
if (posix_kill($PID, 0))
exec("kill -9 {$PID}");
}
}
?>
$thread = new Thread();
if ($thread->CheckPIDExistance($SCRIPT_PATH.'/'.PID_FILE))
die("ERROR: Only one copy of the script could be executed at the same time\n");
if (!$thread->RegisterPID($SCRIPT_PATH.'/'.PID_FILE))
die("ERROR: Cannot register script's PID\n");
{СКРИПТ}
$thread->KillPid($SCRIPT_PATH.'/'.PID_FILE);
|
но когда смотрю на сам процесс выполнения скрипта - бывает, что - ничего не происходит, а при попытке запустить выдаёт, что он уже работает ...
привязывать скрипт ко времени и убивать его принудительно не желательно, т.к. не известно, сколько он будет выполняться ...
в общем - как определить, что скрипт подвис?
кроме как - записывать в файл время его последнего срабатывания, и если он ничего не делал в течении 30 сек, то убивать - мне больше ничего в голову не приходит.
есть ещё какие-нить более функциональные решения? | |
|
|
|
|
|
|
|
для: naxa
(05.09.2009 в 19:23)
| | может будет проще, если Вы всё то же самое без классов нарисуете? | |
|
|
|
|
|
|
|
для: Trianon
(05.09.2009 в 20:44)
| | проще для кого? проще чтобы помочь?
не совсем понял о чём Вы и причём здесь классы ... | |
|
|
|
|
|
|
|
для: naxa
(05.09.2009 в 21:06)
| | для Вас. Проще, чтобы понять.
UPD. я-то продрался сквозь шелуху ОО-синтаксиса, и въехал в написанное.
Но вот совсем не убежден, что Вы понимаете, как оно на самом деле работает.
И шелуха этому пониманию изрядно мешает. | |
|
|
|
|
|
|
|
для: Trianon
(05.09.2009 в 21:22)
| | вопрос заключается в этом:
как определить, что скрипт подвис?
кроме как - записывать в файл время его последнего срабатывания, и если он ничего не делал в течении 30 сек, то убивать - мне больше ничего в голову не приходит.
есть ещё какие-нить более функциональные решения?
то что привёл выше ... ну не знаю - в порыве писанины написал :), но речь совсем не об этом ... | |
|
|
|
|
|
|
|
для: naxa
(05.09.2009 в 21:30)
| | >[b]как определить, что скрипт подвис?
Если в течение разумного времени (куда менее 30 секунд) скрипт успешно не завершил работу, значит он подвис.
Сервисы (демоны) на php не пишут. | |
|
|
|
|
|
|
|
для: Trianon
(05.09.2009 в 21:44)
| | >>Если в течение разумного времени (куда менее 30 секунд) скрипт успешно не завершил работу, значит он подвис.
вы вообще читали, что я написал? :)
===================
1). есть скрипт, который нужно, чтобы работал постоянно, а когда завершит поставленную задачу - запускался снова.
2) привязывать скрипт ко времени и убивать его принудительно не желательно, т.к. не известно, сколько он будет выполняться ...
===================
set_time_limit(0); стоит там не случайно ... и ни о каких 30 сек не может быть и речи ...
>>Сервисы (демоны) на php не пишут.
а на чём пишутся? мне б что-нить простенькое ... может подскажите какие-нить готовые решения? т.к. я даже не знаю в какую сторону копать - и что искать ...
из того что искал - ничего не нашёл :( | |
|
|
|
|
|
|
|
для: naxa
(05.09.2009 в 22:04)
| | На С++ например... Зависит от задачи, всегда можно найти другой выход. | |
|
|
|
|
|
|
|
для: Trianon
(05.09.2009 в 21:44)
| | На PHP вполне реально написать многопроцессовые демоны, но производительность от них будет низкая. | |
|
|
|
|
|
|
|
для: @ndry
(06.09.2009 в 10:56)
| | именно поэтому демоны на php не пишут. :) | |
|
|
|
|