У меня есть скрипт PHP, который выполняет запросы на сервере MYSQL, и я хочу выполнять его один раз в день!
В первый раз я сам запускаю сценарий. И я хочу, чтобы сценарий, в конце выполнения, выбирал случайное время в день, между 8:30 и 7:30 вечера, и автоматически переводил себя автоматически на следующий день, в это время. Является ли это возможным?
Чтобы выбрать случайное время, я закодирован следующим образом:
$tomorrow = new DateTime(date('Y-m-d H:m:s', time()+86400));
$tomorrow1 = $tomorrow -> setTime(8,30,0);
$tomorrow2 = $tomorrow -> setTime(19,30,0);
$min_time = strtotime($tomorrow1->format('Y-m-d H:m:s'));
$max_time = strtotime($tomorrow2->format('Y-m-d H:m:s'));
$rand_time = rand($min_time, $max_time);
Но тогда я не знаю, как сделать автоматическое выполнение для скрипта в это время. Может быть, я могу сделать паузу так:
sleep ($rand_time - time());
Но я не знаю, как после этого выполнить повторный сценарий. И я не думаю, что сон - лучшее решение. Вы, если есть способ и как это сделать?
Подход, используемый, например, APT::Periodic
заключается в том, чтобы начать работу в фиксированное время (в вашем случае 08:30) и сон в течение случайного периода времени в качестве первой команды на вашем задании (в вашем случае для $(($RANDOM % 39600))
секунд, если ваша оболочка - Bash).
Это позволяет избежать необходимости писать что-либо в crontab.
Я не знаю PHP, но думаю, что это будет выглядеть примерно так:
#/usr/bin/php
// Wait 0-11 hours before starting (invoked by cron at 0830)
sleep(rand(0, 39600));
// It now a time between 0830 and 1930
// rest of your code here
и ваш кронтаб был бы просто
30 8 * * * /path/to/my/script
Кроме того, не спите вообще в своем скрипте, но выполняйте спящий режим в команде crontab:
SHELL=/bin/bash
30 8 * * * sleep $(($RANDOM % 39600)) && /path/to/my/script
Это может быть предпочтительнее, если вам когда-либо понадобится выполнить скрипт вручную (и не хотите ждать до 11 часов для его запуска).
APT::Periodic
- это функция менеджера пакетов aptitude
, которая ежедневно загружает обновленные пакеты. Чтобы предотвратить перегрузку серверов архивации, все установки не должны использовать одно и то же время суток для выполнения своих обновлений. Таким образом, они запускаются в одно и то же время (для данного часового пояса системы), но ждут случайное время от 0 до 30 минут, прежде чем начать. Это не обязательно знать, чтобы понять мой ответ, поэтому я упустил детали. См UnaTTended Обновления на Debian Wiki для получения дополнительной информации , если вы хотите.
Хорошо, я могу использовать cron, но проблема все еще остается: мне нужно иметь возможность изменять планировщик задач на следующий день после самого самого php файла!