оцените демон на php плиз

-=SG=-

Guest
оцените демон на php плиз

Доброе утро уважаемые, вот возникла необходимость написать демон на пхп (а то падения крона на серваке задолбали)

Опыта написания демонов нет, поэтому инфу собирал по крупицам, прошу знатоков заценить результат и подправить/оптимизировать если можно указать на возможные косяки в работе.

Сразу оговорка, к system() доступа нет, поэтому пришлось идти другим путем. Скрипт проверил на 2 вебсерваках, вроде работает как надо, но хотелось бы узнать следующие моменты:

а какже макс. время исполнения скрипта ..прокатиит ли здесь set_time_limit(0); или это ограничение вообще работает тока когда скрипт запускается от имени клиента (браузера) ..а крон (от имени сервера) будет спокойно исполнять его вечно (до перезагруза сервер) это нормально?

вот собственно код (помидорами просьба не бросать)

PHP:
// снимим ограничение на длительность исполнения скрипта.
if (ini_get('safe_mode'))
ini_set ('max_execution_time', "0");
else
set_time_limit(0);

ob_implicit_flush(1); 
ignore_user_abort(1);

//функция выполняемая при выходе 
function vihod()
{	
$fp = fopen("data/demon.txt", "w");
fputs($fp,'0');
fclose($fp);
}

//проверка запущен ли уже скрипт
$fp = fopen("data/demon.txt", "r");					
$rezult=fread($fp,4096); 
fclose($fp);

if ($rezult==1)
exit ('скрипт уже запущен');
else
{
	//устанавливаем флаг запуска					
	$fp = fopen("data/demon.txt", "w");					
	fputs($fp, '1');
	fclose($fp);
	
	//вечный цикл
	for ($i=2; $i>0; $i++)
	{			
	
		//текст основного скрипта
		
		//конец скрипта и задержка
		sleep(30);
	}
	register_shutdown_function (vihod());
}
 

AHTIXPICT

Новичок
не знаю зачем такой изврат нужен

Но самое интересное это "//вечный цикл"
Что будет когда $i достигнет максимального значения отведеного для integer
Бесконечный цикл так не делают
 

phprus

Moderator
Команда форума
Вечный цикл я бы сделал как while (true) так как переменная i имеет не бесконечную размерность.
 

-=SG=-

Guest
> не знаю зачем такой изврат нужен
система "web2email"

>за while (true) спасибо!

А так вообще есть ещё замечания?
 

-=SG=-

Guest
AHTIXPICT > нет возможности завершить скрипт
да вроде и не нужна :) ... а как это сделать если что ... поможет ли вызов break внутри вечного цкла ?

SiMM - спасибо большое, бум просвещаться...
 

-=SG=-

Guest
возникла проблема .. коглда тестирую на большом куске кода то почемуто останавливается цикл все равно :( а ещё хуже не записывается флаг о том что скрипт более не запущен ..т.е. не отрабатывает register_shutdown_function ... подскажите куда копать?
 

SiMM

Новичок
Не нужен тебе для этой задачи никакой демон. Ссылку на подробности я уже давал. Не занимайся хернёй.
 

-=SG=-

Guest
SiMM
способ с comand не могу юзать т.к. ящик у меня на другом серваке
способ запуска скрипта с помощью другой страницы сайта .. ну эт не серьезно...
 

Steamroller

Новичок
Автор оригинала: AHTIXPICT

Но самое интересное это "//вечный цикл"
Что будет когда $i достигнет максимального значения отведеного для integer
При sleep(30) - это примерно через 23 тысячи лет.
За это время наверняка размер integer подрастет.
 

SiMM

Новичок
-=SG=-, невнимательно видимо статью читал. Что мешает использовать
> Вариант 3: используем CRON
?
 

-=SG=-

Guest
SiMM ты невнимательно видимо читал мой первый пост ... цитирую

>> (а то падения крона на серваке задолбали) !!

блин а наньше помню на форуме, попиннают по делу если есть за что и дадут дельный совет ... а теперь просто пинают по любому поводу .. жаль жаль ...

итак что изменилось за это время ... демон таки отладил, сделал возможность остановки (если в файл где записываются флаги записать "3") запись флагов и функций при выходе все нормально отрабатывает, вот только пустой демон (без основного скрипта) или с "рыбой" работает как надо а с основной программой (ну блин там 5-6 тыс строк) демон живет не более 1 цикла ... вот борюсь с этим ...

Если кому интересно то вот код (альтернатива крону) позволяющий запускать скрипт в единичном екземпляре который будет висеть(исполняться) в памяти сервера (теоритически вечно) на всякий случай предусмотрена остановка демона а также его запуск в случае перезагруза сервера (для этого ссылку на этот скрипт надо воткнуть таки в крон раз в час/сутки например)

P.S> (Screjet разве не это называют демоном )

PHP:
<?		
// снимим ограничение на длительность исполнения скрипта.
if (ini_get('safe_mode'))
ini_set ('max_execution_time', "0");
else
set_time_limit(0);
ob_implicit_flush(1); 
ignore_user_abort(true);

//функция выполняемая при выходе 
function vihod()
{	
	$demon_fp = fopen("data/demon.txt", "w");
	$demon_rezult=fread($demon_fp,4096); 
	if ($demon_rezult!=3)
	fputs($demon_fp,'0');
	fclose($demon_fp);
}
register_shutdown_function ('vihod');					

//проверка запущен ли уже скрипт
$demon_fp = fopen("data/demon.txt", "r");					
$demon_rezult=fread($demon_fp,4096); 
fclose($demon_fp);

if ($demon_rezult==1)
exit ('скрипт уже запущен');			
elseif ($demon_rezult!=3)
{					
	//устанавливаем флаг					
	$demon_fp = fopen("data/demon.txt", "w");					
	fputs($demon_fp, '1');
	fclose($demon_fp);
				
	//вечный цикл
	while(1!=0)
	{			
		flush();	
		register_shutdown_function ('vihod');					
		//на случай экстренной остановки демона
		$demon_fp = fopen("data/demon.txt", "r");					
		$demon_rezult=fread($demon_fp,4096); 
		fclose($demon_fp);
		if ($demon_rezult==3)
		break 20;
		
			
		// текст основного скрипта
							
		
		//конец скрипта
		sleep(20);
	}			
}
?>
 

SiMM

Новичок
> (а то падения крона на серваке задолбали) !!
Дык разбирайся с кроном/админом - работать методом установки костылей - это не наш метод.
 

Rvm

Новичок
Убей процесс по kill - твой демон больше не запуститься
 
Сверху