Остановка скрипта при ignore_user_abort(true) ?

Страшный Злодей

Бывший член клуба (достало хамство).
Остановка скрипта при ignore_user_abort(true) ?

Прошу прощения, если решение лежит на поверхности, сам не нашёл. Собственно вопрос в том, можно ли остановить выполнение скрипта, в котором установлено ignore_user_abort(true), не прибегая к серверной команде "kill" ? И ещё как узнать сигнал pid скрипта, если скрипт "просыпается" на долю секунды, один раз в несколько минут (в "спячку" уходит по средством sleep() )?
 

AmdY

Пью пиво
Команда форума
проверай флаг, который может быть изменён другим скриптом, допустим запись в базе, если флаг найден - exit();
pid можно узнать либо при запуске скрипта, либо его может записать куда-либо сам скрипт во время работы, так часто делают, чтобы проверять статус.
 

Страшный Злодей

Бывший член клуба (достало хамство).
Автор оригинала: AmdY
проверай флаг, который может быть изменён другим скриптом, допустим запись в базе, если флаг найден - exit();
pid можно узнать либо при запуске скрипта, либо его может записать куда-либо сам скрипт во время работы, так часто делают, чтобы проверять статус.
То, что надо! Особенно про "флаг, который может быть изменён другим скриптом", очень изящное решение. Как всегда, когда узнаёшь гениальный ответ, начинаешь думать - "ну как я сам то раньше не догодался?" :)
 

Активист

Активист
Команда форума
У меня для обеспечения "уникальности скрипта" используется
PHP:
	function isRunning() {
		clearstatcache();		
		if (!file_exists("tmp/runstatus.tmp")) {
			return false;
		} elseif ((file_get_contents("tmp/runstatus.tmp") + 60) < time()) {
			return false;
		} 
		
		return true;
	}
	
	function updateRunStatus() {
		clearstatcache();
		
		if (file_exists("tmp/runstatus.tmp")) {
			@unlink("tmp/runstatus.tmp", time());
		}
		
		file_put_contents("tmp/runstatus.tmp", time());
	}
По этому же принципу можно и "прервать скрипт".
Про PID сюда [m]getmypid[/m]
 

Страшный Злодей

Бывший член клуба (достало хамство).
Для прерывания скрипта, я решил, по подсказке AmdY, проверять флаг в специально созданом файле. Следующий код вставил в начало цикла того файла, который необходимо останавливать:
PHP:
$police = "police.php"; // файл, выдающий разрешение/останавливающий скрипт     
if(!$ticket = @fopen($police, "r")) {        
    echo("Нет доступа к файлу $police ");
    exit;     
}  else  {          
    $access = trim(fread($ticket, 100)); // получаем билет         
    fclose($ticket);         
    if($access != "Order Allow") {              
        echo("$police не разрешает выполнение скрипта");             
        exit;         
    }     
}
Активист , Вам спасибо, что раскрыли мне глаза на функцию [m]getmypid[/m]. По поводу кода представленного Вами, хотел уточнить смысл строки "if((file_get_contents("tmp/runstatus.tmp") + 60) < time())" , не могли бы пояснить?
 

Активист

Активист
Команда форума
Это система уникальности запуска скрипта .

В начали одного большого форича стоит код
PHP:
$object->updateRunStatus()
Общее время работы скрипта - 2-4 часа.

Один цикл форича выполняется около 20-40 секунд, тоесть, обновление о "текущем статусе" может запаздывать на <= 60 секунд. Если, скажем, время последнего обновления метки времени в runstatus.tmp > 60, значит скрипт умер - админ набрал "killall php" или панель перезагрузила Apache, следовательно, "скрипт прекратил свое существование и не удалил файл runstatus.tmp", а значит и можно запускать другой экземпляр скрипта, ибо, теперь он будет уникален.

Надеюсь Вам понятно.
 

Страшный Злодей

Бывший член клуба (достало хамство).
изначально, как раз и смутила метка времени, теперь вы объяснили. Тоже хороший алгортим.
 
Сверху