Это моя реализация планировщика, мне нужно только запустить его, если он не активен, и добавить все задания в таблицу заданий mysql (у меня уже есть одно для моего основного скрипта), этот скрипт запустит все задания, готовые кбыть выполненным (таблица sql имеет поле datetime).
То, что я называю "Mutex", - это класс, который сообщает, запущена ли одна или несколько копий сценария, и может даже отправлять команды запущенному сценарию.через канал (вам просто нужно создать новый мьютекс с одинаковым именем для всех сценариев), чтобы вы могли даже остановить запущенный сценарий из другого сценария.
<?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
}
?>
Моя функция «run_script» работает так жев качестве функции запуска «Sciberras».
Чтобы активировать планировщик, вы должны просто использовать эту команду
run_script('scheduler.php');
, чтобы проверить, активна ли она
$m=new Mutex('jscheduler');
if(!$m->test_lock())
echo 'SCHEDULER IS ACTIVE';
else
echo 'SCHEDULER IS INACTIVE';
иостановите планировщик
$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...';
Возможно, я зашел слишком далеко от его реализации, в любом случае может возникнуть проблема с "задержкой", например, если планировщик запускается в 0: 00.00 и у меня есть два scripts в 0: 01.01 и 0: 01.59 оба запускаются в 0: 02.0.Чтобы исправить это «отставание», я могу получить все задания, запланированные на следующую минуту, и запланировать их, как в коде Sciberras, используя time_sleep_until.Это не создаст слишком много запущенных потоков (я могу захотеть проверить, есть ли ограничение или падение производительности при запуске ОГРОМНОГО количества потоков, но я уверен, что будут некоторые проблемы) и обеспечить идеальное время, требующее только проверки, еслиПланировщик активен.