Управление cron через веб интерфейс для запуска php скрипта
Задача : нужно было реализовать запуск php скрипта (добавляет определенные данные в БД сайта), но при етом добавить управление временем и частоту запуска + еще куча доп настроек.
Найдно было несколько решений :
использовать трафик (смотреть кода ктото зашол на сайт) и по меткам и времени запускать скрипт.
использовать “CronTable” http://ruseller.com/lessons.php?rub=37&id=1153 (но тут нада ставить доп пхп библиотеки).
в крон /etc/crontab добавить * * * * * php -f /usr/local/путь к скрипту/modules/cron/cron_crontab.php (данная строка запускается каждую минуту) в котором будет запускаться по соотв условию задание (хороший метод но мне бы пришлось много переделывать)
короче придумал свой костыль для решения проблемы но для него нужен доступ к системе (Freebsd linux и т.д. ).
Суть в кратце вебморда для изменения значений параметров крона (минуты часы день месяц день_недели) и сохранение его в заданый фаил , добавление для юзера пользовательского crontab делаем симлинк /var/spool/cron/crontabs/www-data (в линуксе крон и пользовательский crontab юзера под которым работает Апач) в нашу рабочую папку со скриптами , еще добавил в /etc/crontab условие для перезапуска крона чтоб он подтянул пользовательский кронтаб т.к. крон смотрит их изменения сравнивая дату папки крона а я меняю только фаил.
Ну и подробнее .Полностью скрип не буду выкладывать только основные моменты:
вебморда и сохранение настроек:
<?php
//***разный код *********
//задание констант или их получение из ПОСТА
$cron_file = $_SERVER['DOCUMENT_ROOT']."/modules/maxua/www-data"; // путь к файлу-симлинку крона
$minute ='22';
$hour ='1';
$mday ='*';
$month ='*';
$wday ='0';
if (@$_POST['save']) {
if ($_POST['rbenable']=='#') $param[] =$_POST['rbenable'];
$param[] =$_POST['minute'];
$param[] =$_POST['hour'];
$param[] =$_POST['mday'];
$param[] =$_POST['month'];
$param[] =$_POST['wday'];
// print_r($param);
// запуск функции сохранени параметров
if (save_cron($cron_file,$param))
{
echo '<p style="border:1px solid green;color:green;text-align:center;psdding:10px;background: #D5F9C8">';
echo ' <b>save settings</b>';
echo '</p><br />';
}
}
// если уже настройки были заменяем переменные на сохраненные
if (file_exists($cron_file)) {
$handle = fopen($cron_file, 'r');
$data = fread($handle, filesize($cron_file));
fclose($handle);
$cron = explode("\t", $data);
$i=0;
$rbenable='';
$rbdisable='';
if ($cron[$i]=='#')
{$rbdisable ='checked="checked"';$i++;}
else $rbenable= 'checked="checked"';
$minute =$cron[$i];$i++;
$hour =$cron[$i];$i++;
$mday =$cron[$i];$i++;
$month =$cron[$i];$i++;
$wday =$cron[$i];
}
?>
// сам веб интерфейс
<form action="" method="post" name="save">
<fieldset style="float: left;width: 200px;margin-right: 20px;">
<a href="http://en.wikipedia.org/wiki/Cron" target="_blank">help cron settings?</a>
<legend>CRON settings</legend>
<label>Cron :
<input type="radio" name="rbenable" <?php echo $rbenable; ?> value="" /> enable</label>
<label><input type="radio" name="rbenable" <?php echo $rbdisable; ?> value="#" /> disable </label>
<br />
<label>minute
<input type="text" value="<?php echo $minute; ?>" name="minute" /></label>
<label>hour
<input type="text" value="<?php echo $hour; ?>" name="hour" /></label>
<label>mday
<input type="text" value="<?php echo $mday; ?>" name="mday" /></label>
<label>month
<input type="text" value="<?php echo $month; ?>" name="month" /></label>
<label>wday
<input type="text" value="<?php echo $wday; ?>" name="wday" /></label>
<label><br />
<center> <input type="submit" value="save" name="save" /></center>
</label>
</fieldset>
</form>
<?php
// функция сохранения настроек
function save_cron($file,$param)
{
$str = implode("\t", $param);
$str .= "\t".'/var/www/путь к скрипту запуска задания/maxua/parserwget.sh'."\n";
$cron=@fopen($file,"w");
fwrite($cron,$str);
fclose($cron);
return true;
}
?>
код канечно не идеальный но работает
создадим пользовательский crontab
crontab -u user_name -e создаст нам задание и откроет в редакторе vi обычно , которое просто сохраним.
user_name - обезательно берем пользователя под которым работает Апач (www или www-data обычно), потому что на созданое задание права
Permissions (Octal) 100600
Owner name www-data
Group name crontab
под другими крон не запустит задание ну и фаил под другим пользователем мы не отредактируем из веб интерфейса .
Создадим симлинк /var/spool/cron/crontabs/www-data в нашу рабочую папку со скриптами.
Еще создал запускаемый скрипт *parserwget.sh в тойже рабочей папке:
#!/bin/sh
`/usr/bin/wget -O - -q http://домен/modules/maxua/скрипт который нужно запускать.php?start=0&limit=0&days=10`
Еще добавил в /etc/crontab условие для перезапуска крона чтоб он подтянул пользовательский кронтаб т.к. крон смотрит их изменения сравнивая дату папки крона а я меняю только фаил.
12 */1 * * * root /etc/init.d/cron restart
Можно было и релоад но чото не срабатывало.
Все наша морда сохраняет в наш симлинк кронтаба /www-data :
22 1 * * 0 /var/www/путь к скрипту/maxua/parserwget.sh
Были и варианты без parserwget.sh где веб морда сохраняет в наш симлинк кронтаба /www-data :
22 1 * * 0 /usr/bin/php -q /var/www/путь к скрипту/maxua/скрипт который нужно запускать.php
или
22 1 * * 0 /usr/bin/wget -O - -q http://домен/modules/maxua/скрипт который нужно запускать.php?start=0&limit=0&days=0
но чото они не запустились (толе крон не перегрузил толи еще что то (много работы небыло времени разбираться) пробуйте может разберетесь что не так)
Спасибо за внимание , может кому то будет полезен и такой вариант ;) .