Как поставить PHP скрипт на cron на локальном сервере?
Чтобы поставить PHP скрипт на выполнение по расписанию (на cron) не на обычном хостинге/сервере в интернете, а на собственном ноутбуке/компьютере, на котором установлен локальный сервер, необходимо сделать следующее:
-
Создать bat-файл, например, с именем cron.bat, в котором будет инструкция для планировщика Windows, что нужно сделать (файл этот создается как обычный текстовый файл, просто его расширение необходимо будет сменить с txt на bat).
В файле в общем случае должно содержаться следующее:
"C:\путь\к\php_экзешнику" -f "C:\путь\к\файлу.php"
У меня установлен локальный сервер EasyPHP, поэтому в моем случае содержимое cron.bat такое:
"C:\PROGRA~2\EASYPH~1.1VC\binaries\php\php_runningversion\php-cgi.exe" -f "C:\Program Files (x86)\EasyPHP-DevServer-14.1VC11\data\localweb\script.php"
Важно! Обратите внимание, что в моем случае путь к php-cgi.exe в батнике написан в сокращенном варианте, почему-то только с именно таким указанием расположения php-cgi.exe все работает.
Важно! В этом пункте и далее, если в примере написано с кавычками, значит так с кавычками и вам писать.
-
Если вы прямо сейчас поставите подготовленный в п.1 батник на выполнение, то сразу же заметите, что каждый раз при его выполнении поверх всех окон появляется небольшое черное DOS-окошко и оно не пропадет до тех пор, пока скрипт выполняется. Разумеется, даже если окошко появляется всего на долю секунды это все равно неудобно, так как отвлекает на себя внимание от текущих дел, поэтому от него надо избавиться.
Для этого необходимо создать vbs-файл, назовем его, например, hidden.vbs (создается аналогично обычному текстовому файлу, после создания сменить расширение txt на vbs) со следующим содержимым в общем случае:
Set WinScriptHost = CreateObject("WScript.Shell")
WinScriptHost.Run Chr(34) & "C:\путь\к\батнику" & Chr(34), 0
Set WinScriptHost = NothingВ моем примере это:
Set WinScriptHost = CreateObject("WScript.Shell")
WinScriptHost.Run Chr(34) & "C:\Program Files (x86)\EasyPHP-DevServer-14.1VC11\data\localweb\cron.bat" & Chr(34), 0
Set WinScriptHost = Nothing -
Запускаем планировщик Windows, на моей Windows 8.1 он находится здесь: C:\Windows\System32\taskschd.msc, кликаем в открывшемся окне по "Создать задачу..." в правом меню, в новом окошке переходим на вкладку "Действия", и нажимаем там кнопку "Создать..." и заполняем поля:
"Действие":
Запуск программы
"Программа или сценарий":
C:\Windows\System32\wscript.exe
"Добавить аргументы" (в общем случае):
"C:\путь\к\файлу.vbs"
"Добавить аргументы" (в случае из моего примера):
"C:\Program Files (x86)\EasyPHP-DevServer-14.1VC11\data\localweb\hidden.vbs"
Собственно, с постановкой задачи все. Осталось только настроить само расписание, условия и параметры запуска вашего задания, это делается на других вкладках окна "Создать задачу", там все интуитивно понятно.
P.S. Да, если вы используете какой-нибудь антивирус с "высоким" уровнем "параноидальности", так сказать, то почти наверняка он начнет ругаться на запуск вашей задачи по крону, так как ему [антивирусу] запускаемая программа неизвестна. Я использую KIS и он в 100% случаев останавливает выполнение до получения разрешения, что, конечно, делает фоновые запуски локальных скриптов по расписанию дико неудобными.
По идее, должна помогать отметка галочек "Запомнить выбор для этой последовательности" и тык в кнопку "Разрешить", но почему-то в моем случае это никак не помогает в долгосрочной перспективе - касперский при каждом запуске все равно выдает диалоговые окна, запрашивающие те же самые разрешения.
Помогает только добавление в "Исключения" запускаемого локальным кроном файла .vbs - это нужно сделать в меню "Настройка" → "Угрозы и исключения" в 2 местах программы Kaspersky Internet Security:
- "Указать доверенные программы" - нажать "Добавить", указать полный путь к .vbs файлу и отметить все галочки вида "Не проверять *"
- "Настроить исключения" - нажать "Добавить", указать полный путь к .vbs файлу, в поля "Объект" и "Хеш файла" указать * и отметить "Все компоненты"
Главное, после того, как сделали оба пункта, не забыть нажать кнопку "Сохранить" на экране "Настройка" → "Угрозы и исключения", только тогда все начнет работать без лишних запросов от антивируса.