Dies ist meine Implementierung des Schedulers, ich brauche nur, um es zu starten, wenn nicht aktiv ist und fügen Sie alle Jobs auf der Mysql-Job-Tabelle (ich habe bereits eine für mein Haupt-Skript), dieses Skript wird alle Jobs bereit, ausgeführt werden (die Sql-Tabelle haben ein Datetime-Feld) starten.
Was ich "Mutex" nenne, ist eine Klasse, die anzeigt, ob eine oder mehrere Kopien des Skripts laufen und sogar Befehle an das laufende Skript über eine Pipe senden kann (Sie müssen einfach eine neue Mutex mit dem gleichen Namen für alle Skripte erstellen), so dass Sie sogar ein laufendes Skript von einem anderen Skript aus anhalten können.
<?php
//---logging---
$logfile = dirname(dirname(__FILE__)).'/scheduler.log';
$ob_file = fopen($logfile,'a');
function ob_file_callback($buffer)
{
global $ob_file;
fwrite($ob_file,$buffer);
}
//--includes---
$inc=dirname(dirname(__FILE__)).'/.include/';
require_once($inc.'Mutex.php');
require_once($inc.'jobdb.php');
//--mutex---
//i call it mutex but it's nothing like POSIX mutex,it's a way to synchronyze scripts
$m=new Mutex('jscheduler');
if(!$m->lock())//if this script is already running
exit();//only one scheduler at time
//---check loop---
set_time_limit(-1);//remove script time limit
for(;;){
ob_start('ob_file_callback');//logging
$j=jobdb_get_ready_jobs(true);//gets all ready jobs,works with mysql
if($j!=null)//found some jobs
foreach($j as $val){//run all jobs
$ex='*SCRIPT NAME AND PARAMETERS HERE*';
if(!run_script($ex))
echo "UNABLE TO LAUNCH THE JOB!\n";
}
$n=($j!=null)?count($j).'JOBS LAUNCHED':'NO JOBS';
sleep(60);
if($m->has_to_stop())//yeah,i can stop this script from other scripts,it works with a file pipeline
exit("# STOPPING SCHEDULER\n");
ob_end_flush();//LOGGING
}
?>
Meine Funktion "run_script" funktioniert auf die gleiche Weise wie die Funktion "run" von Sciberras.
Um den Scheduler zu aktivieren, sollten Sie einfach diesen Befehl verwenden
run_script('scheduler.php');
um zu prüfen, ob sie aktiv ist
$m=new Mutex('jscheduler');
if(!$m->test_lock())
echo 'SCHEDULER IS ACTIVE';
else
echo 'SCHEDULER IS INACTIVE';
und zum Anhalten des Schedulers
$m=new Mutex('jscheduler');
$m->ask_to_stop();//simply sent throught the pipe the command,now has_to_stop()will return true on the process that have gain the lock of the mutex
echo 'STOPPING SCHEDULER...';
Vielleicht bin ich bei der Implementierung zu weit gegangen, auf jeden Fall kann es ein Problem der "Verzögerung" geben, z.B. wenn der Scheduler um 0:00.00 startet und ich zwei Skripte um 0:01.01 und 0:01.59 habe, werden beide um 0:02.0 gestartet. Um diese "Verzögerung" zu beheben, kann ich alle in der nächsten Minute geplanten Jobs zurückholen und sie wie im Sciberras-Code mit time_sleep_until planen. Dies wird nicht zu viele laufende Threads erzeugen (ich möchte vielleicht testen, ob es eine Grenze oder einen Leistungsabfall beim Starten einer HUDGE Menge von Threads gibt, aber ich bin mir sicher, dass es einige Probleme geben wird) und stellt ein perfektes Timing sicher, bei dem nur geprüft werden muss, ob der Scheduler aktiv ist.