PHP + Cron

Дата: Октябрь 20, 2009

(3) комментариев

К сожалению, стандартные вредства пхп не позволяют в полном объёме работать с планировщиком задач 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
<?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='f

Тут я привёл всего лишь концепцию того, как можно реализовать планировщик. Функционал всегда можно добавить, тем более в данном случае необходимо просто добавить новый запрос в массив $tasks :)

a




    3 комментариев на "PHP + Cron"

    Павел сказал:
    04.11.2009

    Но сам файл cron.php таки нужно всё равно засовывать в crontab…

    Sergey сказал:
    06.11.2009

    это да.. там же и написано, что это псевдо крон :)
    а вообще в друпале видил, что там есть какие-то другие апи по работе с кроном, но комать огромную цмску мне конешно же было лень из-за такой мелочи.. в 90% случаев сойдёт и этот вариант.. тем более он очень прост в реализации

    StarCOM сказал:
    30.04.2010

    Нет смысла в этом скрипте, это полнейший бред. Вот подумайте если нужно юзать крон чтоб юзануть этот псевдо-крон смысл от его тогда? Да и еще если нужно например файл запускать каждый месяц так его постоянно над добавлять. Можно только сделать переменную которая будет вносить отсчет дней и на 1е число обновляться к нулю. Вот только так выйдет и то при этом все равно ежедневный запуск крона нужен.

    Не изобретайте колесо которое уже открыли до вас. Проще прочитать мануал по крону стандартному и юзать чем этот псевдо-крон.

    Продолжение дискуссии на форуме: link


    Вы можете продолжить обсуждение этой статьи на форуме


    Имя : 
    Почта : 
    Сайт : 
    Комментарий : 

    Проверка комментариев включена. Прежде чем Ваши комментарии будут опубликованы пройдет какое-то время.

    Создание сайта - Echo-group Раскрутка сайтов