Napisa³em klase obs³uguj±c± Cron-a, mysle ze sie przyda potomnym ktorzy beda z tym walczyæ.
Testowane pod Slackware 10.1, przygotowane tak by dzia³a³o pod innymi dystrybucjami LINUX-a/
A zatem tak wygl±da:
<?
define('BEGIN_CRON_LINE', '#BEGIN_CRON_LINE cron.php'); //okreslenie poczatku bloku define('END_CRON_LINE', '#END_CRON_LINE cron.php'); //okreslenie konca bloku define('CRONTAB_PATH', '/var/spool/cron/crontabs/'); //katalog z plikami crontab
class cron
{
var $user = ''; //zalogowany uzytkownik UNIX
var $tab = ''; //sciezka do pliku crontab
var $reldir = ''; //katalog z plikiem cron.php
var $begin_cron_line = '';
var $end_cron_line = '';
//Sprawdzanie czy proces Cron jest aktywny
function checkCromProcessRunning()
{
if(''.exec('ps ax | grep crond') == '') return 0;
else
return 1;
}
//konstruktor
function cron()
{
//ustalenie katalogu z plikiem cron.php
//zachowanie unikalnych indentyfikatorow blokow dla aplikacji
//dzialajacych na tym samym serwerze by uniknac kolidowania zapisu zadan
$this->begin_cron_line = BEGIN_CRON_LINE.' ('.$this->reldir.')';
$this->end_cron_line = END_CRON_LINE.' ('.$this->reldir.')';
//process crond
if($this->checkCromProcessRunning() == 0)
{
if($this->checkCromProcessRunning() == 0)
{
echo "-Brak zainstalowanego pakietu 'cron'"; }
}
//zczynanie nazwy zalogowanego uzytkownika
$this->user = exec('whoami');
//okreslenie sciezki to pliku z crontab dla uzytkownia apache lub 'root'
$this->tab = CRONTAB_PATH.$this->user;
exec('touch '.$this->tab); //proba stworzenia pliku if(!($fp = @fopen($this->tab, "r+"))) //sprawdzenie dla uzytkownia apache {
$this->tab = CRONTAB_PATH.'root';
if(!($fp = @fopen($this->tab, "r+"))) //sprawdzenie dla root {
echo '----- cron.php -----<br><br>'; echo 'Brak uprawnien do nastepujacych plikow:<br><br>'; echo CRONTAB_PATH
.$this->user.'<br>'; echo CRONTAB_PATH
.'root<br><br>'; echo 'By umozliwic ustawianie cyklicznosci ustaw lub popros administratora o<br>'; echo 'ustawienie praw zapisu dla uzytkownika <b>'.$this->user.'</b> do jednego z tych plikow<br>'; }
else
{
}
}
else
{
}
}
//zwraca tablice zadan wczesniej wpisanych przez cron.php
//return:
//struktura wyniku
//[0][0] (zakres 0-59) oznacza minuty.
//[0][1] (zakres 0-23) oznacza godzine.
//[0][2] (zakres 0-31) oznacza dzieñ miesiaca.
//[0][3] (zakres 0-12) oznacza miesiac. (0 i 1 to styczen)
//[0][4] (zakres 0-7) oznacza dzien tygodnia (0 i 7 to niedziela)
//[0][5] nazwa plik php
//
//[1][0] (zakres 0-59) oznacza minuty.
//[1][1] ...
//...
function getTasks()
{
$content = file($this->tab); $validblock = 0;
$pos = 0;
for($i=0; $i<count($content); $i++)
{
$line = trim($content[$i]);
if($line == $this->begin_cron_line) //poczatek bloku
{
$validblock = 1;
continue;
}
if($line == $this->end_cron_line) //koniec bloku
{
$validblock = 0;
continue;
}
if($validblock == 1) //parsowanie bloku
{
$task[5
] = str_replace("php ".$this->reldir, '', $task[5
]); $result[$pos] = $task;
$pos++;
}
}
return $result;
}
//wyswietla zawartosc pliku crontab
function cat()
{
}
//Usuniecie wszystkich danych utworzonych przez klase cron
function deleteAllTasks()
{
//zczytanie z wykluczeniem bloku cron.php
$crontab = '';
$content = file($this->tab); $validblock = 0;
$nothingtodelete = 1;
$lastline = '';
for($i=0; $i<count($content); $i++)
{
$line = trim($content[$i]); if($line == $this->begin_cron_line) //poczatek bloku
{
$validblock = 1;
$nothingtodelete = 0;
continue;
}
if($line == $this->end_cron_line) //koniec bloku
{
$validblock = 0;
$nothingtodelete = 0;
continue;
}
if($validblock == 0 && (!($lastline == $line && $line == '')) ) //dodanie lini obcej
$crontab .= $line."\n";
$lastline = $line;
}
// zapisanie nowych danych jesli istnieje taka potrzeba
if($nothingtodelete == 0)
{
// otwarcie pliku do zapisu
$fp = fopen($this->tab, 'w'); // zapisanie danych
// zamkniecie pliku
}
}
//Dodanie zadania do listy cron-a
//$phpfile: plik [nazwa].php z relatywna sciezka od sciezki cron.php
function addTask($minutes, $hours, $daysofmonth, $months, $daysofweek, $phpfile)
{
//zapamietanie istniejacych zadan
$tasks = $this->getTasks();
//dodanie nowego
$tasks[count($tasks)] = array($minutes, $hours, $daysofmonth, $months, $daysofweek, $phpfile);
//usuniecie starych
$this->deleteAllTasks();
$block = "\n".$this->begin_cron_line."\n";
for($i=0; $i<count($tasks); $i++)
{
$minutes = $tasks[$i][0];
$hours = $tasks[$i][1];
$daysofmonth = $tasks[$i][2];
$months = $tasks[$i][3];
$daysofweek = $tasks[$i][4];
$phpfile = $tasks[$i][5];
$block .= "$minutes $hours $daysofmonth $months $daysofweek ";
$block .= "php ".$this->reldir.$phpfile." > /dev/null \n";
}
$block .= $this->end_cron_line;
// otwarcie pliku do dopisu
$fp = fopen($this->tab, 'a'); // zapisanie danych
// zamkniêcie pliku
//restartowanie cron-a, by dzialanie nowego zadania bylo natychmiastowe (jesli sa prawa dla uzytk. apache)
}
function deleteTask($phpfile)
{
//zczytanie z wykluczeniem zadan dotyczacych $phpfile
$crontab = '';
$content = file($this->tab); $validblock = 0;
for($i=0; $i<count($content); $i++)
{
$line = trim($content[$i]); if($line == $this->begin_cron_line) //poczatek bloku
$validblock = 1;
if($line == $this->end_cron_line) //koniec bloku
$validblock = 0;
if($validblock == 1)
{
$searchfor = "/$phpfile > /dev/null";
if(!(strpos($line, $searchfor) === false)) continue;
}
$crontab .= $line."\n";
}
// otwarcie pliku do zapisu
$fp = fopen($this->tab, 'w'); // zapisanie danych
// zamkniecie pliku
}
}
?>
Trzeba uwa¿aæ by w uruchamianym pliku linki do innych plikow byly absolutne np.
<?php
include(dirname(__FILE__).'../config.php'); ?>
A oto kilka przykladów wykorzystania.1. Wy¶wietlenie zapisanych zadañ
<?php
$c = new cron;
$tasks = $c->getTasks();
for($i=0; $i<count($tasks); $i++)
{
$t = $tasks[$i];
}
?>
2. Kasowanie wszystkich utworzonych
<?php
$c = new cron;
$c->deleteAllTasks();
?>
3. Dodanie paru nowych zadañ
<?php
$c = new cron;
$c->addTask('*', '*', '*', '*', '*', '../plugins/system/sync1.php');
$c->addTask('1', '*', '*', '*', '*', '../plugins/system/sync2.php');
$c->addTask('2', '*', '1-20/2', '*', '*', '../plugins/system/sync3.php');
$c->addTask('3', '*', '*', '*', '*', '../plugins/system/sync4.php');
$c->addTask('4', '*', '*', '1-2', '*', '../plugins/system/sync5.php');
?>
4. Kasowanie utworzonych zadan dotycz±cych danego pliku
<?php
$c = new cron;
$c->deleteTask('../plugins/system/sync.php');
?>