Главная » Шпаргалка » PHP MYSQL javascript » PHP » Управление cron через веб интерфейс

Управление 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="" />&nbsp;&nbsp;enable</label>
          <label><input type="radio" name="rbenable" <?php echo $rbdisable; ?> value="#" />&nbsp;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

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

Спасибо за внимание , может кому то будет полезен и такой вариант ;) .