Cron для Windows
Четверг, 14 Апр 2011 13:26
Появилась необходимость в ежедневно выполняемых с определенной периодичностью скриптах, причем запускаемых с локального хоста (стоит Denwer). Ясен пень, использовать придется либо cron с возможностью запуска php-скриптов, либо какие-нибудь windows-планировщики. Испробовал кучу вариантов, поэтому решил рассказать, каким образом в конечном итоге я вышел из ситуации.
Крон для Windows — nncron
В первую очередь я нагуглил тот факт, что классический cron — это вообще линуксовская штука. Но для винды также есть свои аналоги, самым продвинутым из которых признана очень мощная программа nncron. Программа в последних версиях работает на Windows 7 и является очень функциональным инструментом для планирования заданий на компьютере.
Поначалу я воспользовался встроенной возможность выполнения скриптов в nncron, прописав следующее:
S" http://localhost/mails/start_cron.php" HTTP-GET
IF
S" 123.html" FWRITE
ELSE 2DROP THEN
Этот скриптик отлично работает с одним «но». При КАЖДОМ выполнении скрипта в Windows на пару секунд выскакивает черное диалоговое окошко и затем пропадает. Причем это окошко может сбивать фокус и само по себе порядочно раздражает. Представьте себе, что у вас целыми днями каждые 5 минут мигает на экране диалог! Испытание не из простых. Избавиться от него можно, если выполнять скрипт с использованием не php.exe, а php-win.exe, который обязательно должен присутствовать в дистрибутиве вашего вебсервера. При этом также может понадобится принудительно подключать php.ini, поскольку ваш вебсервер по умолчанию может использовать php.ini из другой папки, и в таком случае вы можете лишиться всех дополнительно подключенных библиотек, как то curl, inocube и т.д., что сделает скрипты, их использующие, нерабочими.
Но вот настроить nncron на выполнение уже программы php-win.exe с параметрами php.ini и cron.php мне так и не удалось. Руководств под это дело кот наплакал, а в справке nncron я соответствующих примеров не нашел. Пробовал в nncron запускать программу по адресу d:\webserves\...\php-win.exe с параметрами -c d:\webservers\...\php.ini -a d:\webservers\...\cron.php, однако результатами мои попытки так и не увенчались.
nncron снес, так как терпеть все время выскакивающее окошко, если ты постоянно работаешь за компьютером, просто нереально. В то же время поставить его на серверную машину вполне можно.
Cron для Windows — планировщик заданий
Здесь я воспользовался инструкцией по настройке планировщика заданий в winXP (первая ссылка в материалах по теме), попытавшись проделать то же для Win7. Пробовал команду
D:\WebServers\usr\local\php5\php-win.exe -с D:\WebServers\usr\local\php5\php.ini -f D:\WebServers\home\script\www\cron.php
,
но хотя скрипт и выполнялся, он все равно не работал. Установка заданию прав администратора тоже не помогла. Пришлось идти дальше.
Cron для Windows — автообновление страницы в Opera
В контекстном меню в Opera есть такая отличная опция Reload Every, в которой можно задать любое время для автообновления страницы. Собственно, так я и сделал: открываем в одной из закладок страницу крона localhost/script/cron.php, жмем правой кнопкой на странице и в контекстном меню в пункте Reload Every указываем нужное время. Быстро, просто, без напрягов. И все же осталось одно «но»: мой основной браузер Firefox, потому запущенная параллельно с ним Opera = -170Мб оперативы, что на моей машине ощутимо. Идем дальше.
Cron для Windows — автообновление страницы в Firefox
Вообще для Firefox давным-давно существовал плагин cronzilla, которому нужно было указать адрес скрипта и периодичность его выполнения, но в Firefox 4 он все еще не работает. Поэтому я попробовал найти аналоги опции в Opera, и наткнулся на замечательный плагин Reload Every, который полностью повторяет опцию reload every в контекстном меню в Opera с одним отличием — при перезапуске Firefox reload every надо запускать заново (в Opere это не требуется).

Этот вариант, учитывая то, что браузер — первая программа, которая запускается на компьютере, меня устроил. Чтобы не мешали постоянно запущенные под cron вкладки, можно открывать их в новом окне.
14 Апр 2011 в 14:49
1Может глупый вопрос, но я его задам. Я правильно понял, что описанный Вами алгоритм позволяет решать следующую задачу:
1) У меня есть пхп скрипт
2) Мне надо запускать(выполнять) этот скрипт периодически, например, каждый час.
3) Для этого предлагается использовать браузер с настроенной на автообновление вкладкой.
Вопрос следующий: Если браузер запустить в автозапуске и оставить в трее в ждущем режиме, эта фишка работать будет? Или надо обязательно явно запустить браузер и не сворачивать его никуда.
14 Апр 2011 в 14:57
2Да, верно поняли. Ждущим режимом вы назвали режим винды или процедуру сворачивания браузера в трей? Если вы настроите браузер как положено, а затем просто свернете его в трей, работать будет точно. Вебсервер, естественно, тоже должен быть включен. По совместимости с режимами винды не подскажу, поэкспериментируйте.
17 Ноя 2011 в 8:14
3Чтобы избежать этого, достаточно создать еще один профиль в Windows и выполнять задание от его имени
04 мая 2012 в 12:24
4в nnCron при настройке задания можно задать чтобы задание выполнялось в hidden режиме