Аналог cron на PHP

Данная тема появилась из-за частых вопросов посетителей нашего сайта о том, что делать, если на хостинге не поддерживается cron?

Первым делом не стоит расстраиваться и торопиться менять сервер или хостера (если конечно он Вас в остальном устраивает). Для всех, у кого на сайте нет поддержки cron, но им необходимо периодически выполнять некоторые задания (скрипты) через определённое время, мы предлагаем сделать аналог cron на PHP.

Самым простым решением можно, конечно, было бы считать использование MySQL. Для этого пришлось бы записать туда время последнего выполнения скрипта, и каждый раз запрашивать это время и сравнивать его с текущим, и как только разница времени превысит указанное - выполнить необходимые действия и перезаписать время последнего выполнения скрипта в MySQL на новое.

Но и у данного способа есть свои недостатки. Во-первых, если Ваш хостинг не поддерживает cron, то возможно и MySQL он тоже не поддерживает. Во-вторых, возможно на своем сайте (или в той части, где необходим cron), Вы сами не используете MySQL, т.к. в этом нет необходимости.

В то же время хостинг с поддержкой PHP найти намного легче, потому мы и предлагаем воспользоваться аналогом cron на PHP.

Вся суть предлагаемого скрипта, создающего аналог cron на PHP, заключается в создании файла на Вашем хостинге, в котором будет храниться время последнего выполнения скрипта. А если быть точнее, то временем последнего выполнения скрипта будет являться время последнего изменения данного файла.

Приводим полный PHP код для реалиазции выполнения файла cron.php с интервалом 10 минут:

<?php
$cron_time=filemtime("cron_time");    //получаем время последнего изменения файла
if (time()-$cron_time>=600) {        //сравниваем с текущим временем - 10 минут
    file_put_contents("cron_time","");    //перезаписываем файл cron_time
    include "cron.php";                //выполняем скрипты из файла cron.php
}
?>

Как видите, скрипт получился совсем маленький, но в то же время очень полезный.

Стоит так же рассмотреть некоторые тонкости работы данного скрипта.

Как оговаривалось ранее, временем последнего выполнения скрипта у нас является время последнего изменения файла cron_time. Сделано это потому, что получить время последнего изменения файла гораздо быстрее и проще, чем считать данные из самого файла. Так же при высокой посещаемости сайта пришлось бы еще добавлять блокировку для перезаписи данного файла, чтобы избежать повреждения записываемых в него данных.

Еще одним моментом, на который стоит обратить внимание, является то, что скрипт содержащийся в файле cron.php, будет выполняться с интервалами не точно раз в 10 минут, а иногда с чуть большими. Это связано с тем, что предлагаемый нами скрипт аналога cron на PHP срабатывает только при заходе какого-нибудь пользователя или бота на сайт.

Другими словами, если посетитель зашел на сайт спустя 9 минут и 55 секунд с момента последнего срабатывания скрипта, то ничего не произойдет, т.к. интервал у нас задан 10 минут. Следующий же посетитель может зайти спустя не ровно 10 минут, а, к примеру, через 10 минут и 12 секунд - вот только тогда и будет выполнен файл cron.php.

Если Вам необходимо, чтобы скрипт срабатывал только один раз в день (с заходом первого посетителя после полуночи), то скрипт можно легко модифицировать:

<?php
$cron_time=filemtime("cron_time");    //получаем время последнего изменения файла
if (date("d")!=date("d",$cron_time)) {    //сравниваем день изменения файла с текущим
    file_put_contents("cron_time","");    //перезаписываем файл cron_time
    include "cron.php";                //выполняем скрипты из файла cron.php
}
?>

Так что всем тем, у кого нету cron, мы бы советовали использовать данный метод для выполнения необходимых действий на сайте с определенными промежутками времени.

https://pp.userapi.com/c847018/v847018009/4f733/1F3Mc5kToq8.jpg