Запуск Скриптов Без Cron
Настало время разобрать что-то приятное. А разберем мы интересную тему "запуск скриптов без cron". Чтобы Вы были Гуру.
Cron — это такая программа, позволяющая выполнять задания по расписанию, в указанное модератором время. Регулярные инструкции действий задаются в файле crontab и каталоги. Это как планировщик заданий, например, ОС Windows, или иной другой.
Почти на всех хостингах, по умолчанию, уже установлен Cron, но исключением есть отсутствие Cron. Это как правило некоторые хостинги и выделенные сервера. Не нужно отчаянно забиваться в Google, есть выход даже из такой ситуации. Хватит вступительных лекций! Спешу предоставить способы запуска скриптов без Cron.
Способы запуска скриптов без Cron:
- С помощью ботов, или посетителей, заходящими на сайт.
- С помощью Вашего ПК
- С помощью другого сервера имеющего Cron
Способ 1:
Как правило, регулярный запуск скриптов требуют более-менее большие проекты и на подобные сайты часто заходят люди, и боты разных поисковых систем.
К примеру, необходимо запустить скрипт один раз ночью. Для этого достаточно простых действий:
$root=$_SERVER['DOCUMENT_ROOT'];
$h=date('H');
if($h>00 && $h<03 && date('d', filectime($root. '/cron/cron_last_time.txt')) != date('d')){inclide $root.'/cron/cron_1.php';}
Строка № 1 — абсолютный путь,
Строка № 2 — текущее время с ведущим нулем,
Строка № 3 логически делится на 2 этапа условия:
- $h>00 && $h<03 — если диапазон текущего времени более 00 и менее 03
- date('d', filectime($root. '/cron/cron_last_time.txt')) != date('d') - и если день последнего изменения файла не равен текущему дню даты
При выполнении всех 3-х условий - подключаем файл, со скриптом и он будет выполняться регулярно, в указанном промежутке времени. Время, разумеется, можно поменять.
В скрипте cron_1.php, обязательно изменим файл, для обновления даты изменения, добавив функцию записи:
file_put_contents($root.'/cron/cron_last_time.txt','-');
Таким способом, дата обновилась на текущий день и дни будут равны. Благодаря этому эффективному и простому алгоритму скриптовый файл по расписанию выполняться будет только один раз, игнорируя множество заходов во временном диапазоне запуска.
Второй способ:
var dt=new Date();
var h=dt.getHours();//Текущий час с ведущим нулем
var d=dt.getUTCDate();//Текущий день месяца
var last_d=false;//День последнего запуска
setInterval(function(){//Запускаем тело функции каждые 60 сек
if(h>00&&h<03 && d!=last_d){//Если час более 00 и менее 03 - выполняем
last_d=d;//В переменную текущего дня пишем текущий день
var newWin=window.open( "http://domain.com/cron/cron_1.php", "Окно для Cron", "width=400,height=600");//Открыть окно.
setTimeout(function(){//Запустить тело функции однократно, через 3 сек.
newWin.close();//Закрыть созданное окно
},3000);
}
},60000);
Для работы данного способа, необходимо создать html-файл, открыть его в браузере и он будет открывать окно, где напрямую обратится к скрипту и запустит его. Безусловно, при надобности, можно передать GET и POST, но это уже индивидуально.
В этом способе есть небольшой недостаток: скрипт открывает файл напрямую. Это значит, запустить скриптовый файл может каждый. Рекомендую передавать секретный ключ через GET, затем на сервере сравнивать. Таким образом никто кроме Вас не запустит скрипт по расписанию.
Третий способ:
- Создать файл с кодом для Cron
- Воспользовавшись планировщиком Cron, задать ему условия выполнения конкретного файла.
- С помощью сокетов, cURL, или функции file_get_contents обратится на другой домен, обратившись к нужному файлу, код которого необходимо регулярно выполнять. Три способа рабочие и вот они:
//с помощью cURL
$ch=curl_init();// 1.инициализация
// 2.указываем параметры, включая url
curl_setopt($ch, CURLOPT_URL, "http://kwo-master.com/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
$output=curl_exec($ch);//3.получаем HTML в качестве результата
curl_close($ch);//4.закрываем соединение
//С помощью сокетов
$fp=fsockopen("kwo-master.com", 80, $errno,$errstr,10);//Параметры1 - Домен,2 - Порт,3 - переменная, хранящая код ошибки(необязательно), 4 - переменная, хранящая текст ошибки(необязательно),5 - время ожидания соединения(необязательно)
if(!$fp){echo "Текст ошибки: $errstr<br>Код ошибки: $errno<br>\n";}
else{
fputs($fp,"GET / HTTP/1.0\r\nHost: kwo-master.com\r\n\r\n");
while(!feof($fp)){echo fgets($fp,1000);}
fclose($fp);
}
//С помощью функции file_get_contents
echo file_get_contents("http://kwo-master.com/");
Обратите внимание! В настройках интерпретатора PHP, должен быть включён модуль "openssl", если работаете на Windows. Для включения, необходимо, раскомментировать строку в файле настроек php.ini "extension=openssl"
Или установить его, с помощью командной строки, через SSH-соединение по 22-му порту.
В принципе это всё! Информация проста, без воды и лекций, работающие способы. Имеете другие идеи запуска скриптов без Cron - поделитесь со мной, чтобы всё было честно ;)