К сожалению, стандартные вредства пхп не позволяют в полном объёме работать с планировщиком задач Cron. Для решения поставленной задачи можно сделать псевдо планировщик.
Принцип работы которого будет следующим:
- Мы создадим файл, запускаемый планировщиком раз в 1 минуту, этот файл будет обращаться к базе заданий и выполнять их в зависимости от даты задания.
Как вы уже догадались этот псевдо крон будет иметь ограничение в 1 минуту по интервалу.
Создадим базу данных для начала
необходимо выполнить следующий запрос
1 2 3 4 5 6 | CREATE TABLE `tasks` ( `id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , `command` VARCHAR( 250 ) NOT NULL , `date` VARCHAR( 15 ) NOT NULL , `type` VARCHAR( 15 ) NOT NULL ) ENGINE = MYISAM |
Добавим теперь одно тестовое задание. Например запуск скрипта test.php из корневой папки пользователя в 2 часа дня, а так же задание которое выполнится 1 раз 12 сентября, 2001 года в 12 часов дня
1 2 3 4 5 6 7 | INSERT INTO `tasks` VALUES ( NULL , 'php test.php', '14:00', 'dayly' );INSERT INTO `tasks` VALUES ( NULL , 'php test2.php', '12.09.2001 12:00', 'once' ); |
теперь у нас есть 2 задания… напишем обработчик dayly и once… остальные обработчики вы можете написать сами на базе моих.. они очень простые ![]()
Но для начала создадим скрипт cron.php и поставим его выполнять каждую минуту в планировщике
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <?php // подключаемся к дазе mysql_connect('host', 'user', 'pass'); mysql_select_db('database'); // сосдавляем запросы для выбора команд $tasks=Array(); $tasks['once']="select command from tasks where type='once' and date='".date(d-m-Y H:i)."'"; $tasks['day']="select command from tasks where type='dayly' and date='".date(H:i)."'"; //обрабатываем запросы foreach($tasks as $k=>$v) { $task=mysql_query($v); while ($row = mysql_fetch_assoc($task)) { if(function_exists('system')) system($row["command"], $log); // переменную лог потом можно записать в результаты выполнения команд elseif(function_exists('exec')) exec(($row["command"],'',$log); // переменную лог потом можно записать в результаты выполнения команд else $log='fail! command executing not supported'; // пишем лог выполнения команд $fp=fopen('log.txt','a+'); fwrite($fp,$log); fclose($fp); } } mysql_close(); |
Тут я привёл всего лишь концепцию того, как можно реализовать планировщик. Функционал всегда можно добавить, тем более в данном случае необходимо просто добавить новый запрос в массив $tasks
PHP + Cron