Плагин nsched (и ряд других задач движка — db_backup, news_views, load_truncate) выполняется через встроенный менеджер cronManager. Чтобы расписание реально соблюдалось, а не срабатывало «когда получится», нужно понимать, как устроен внутренний cron NGCMS, и настроить его правильный запуск на вашем окружении.
1. Как устроен «псевдо-cron» в движке
- Список задач и расписание хранится в файле engine/conf/cron.php (заполняется через админку: Система → CRON, либо автоматически при установке плагина через cronManager::registerTask()).
- Сам менеджер (cronManage, класс в engine/includes/inc/extras.inc.php) не запускается по таймеру сам по себе. Он вызывается вручную в двух местах:
- index.php (в самом конце, после отдачи страницы) — вызывает $cron->run()только когда кто-то открывает фронтенд сайта;
- syscron.php (отдельная точка входа в корне сайта) — вызывает $cron->run(true) и предназначена именно для внешнего вызова по расписанию (настоящим cron/планировщиком).
- Внутри run() есть защита от повторных/параллельных запусков: он создаёт flag-файлы во
engine/cache/main/<subsite>/core/cron_<timestamp>. Задачи фактически выполняются не чаще одного раза в 5 минут ($period = 300), даже если реальных вызовов было больше.
Из этого следуют два важных вывода- Если полагаться только на index.php, задачи будут выполняться только при живом трафике на сайт. На сайте без посетителей (ночью, на служебных/тестовых окружениях, при малой посещаемости) расписание может не соблюдаться часами.
- Чтобы cron работал предсказуемо, независимо от посетителей, нужно настроить внешний вызов syscron.php через настоящий планировщик задач операционной системы или панели хостинга.
2. Локальная разработка (Windows / OSPanel, Denwer и т.п.)
Используется Планировщик заданий Windows (Task Scheduler).
Через GUI
- Win + R → taskschd.msc.
- «Создать задачу» → указать имя, например NGCMS-cron.
- Триггер: «Повторять задачу каждые» → 5 минут,«в течение» → «Неопределенно».
- Действие → «Запуск программы»:
- Программа: C:\OSPanel\modules\PHP-8.2\PHP\php.exe
- Аргументы: C:\OSPanel\home\it\syscron.php
- Рабочая папка: C:\OSPanel\home\it
Через PowerShell / schtasks (эквивалент)
Код:
$action = New-ScheduledTaskAction -Execute 'C:\OSPanel\modules\PHP-8.2\PHP\php.exe' `
-Argument 'syscron.php' -WorkingDirectory 'C:\OSPanel\home\it' $trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) `
-RepetitionInterval (New-TimeSpan -Minutes 5) -RepetitionDuration ([TimeSpan]::MaxValue) Register-ScheduledTask -TaskName 'NGCMS-cron' -Action $action -Trigger $trigger `
-Description 'Запуск syscron.php NGCMS каждые 5 минут'
Проверить/удалить задачу:
Код:
Get-ScheduledTask -TaskName 'NGCMS-cron'
Unregister-ScheduledTask -TaskName 'NGCMS-cron' -Confirm:$false
3. Сервер по SSH (VPS/VDS с root-доступом)
Настоящий cron через crontab. Путь к PHP CLI и к сайту нужно подставить свои (уточнить командой which php).
Код:
Добавить строку (запуск каждые 5 минут):
Код:
*/5 * * * * /usr/bin/php /var/www/it/syscron.php >/dev/null 2>&1
Если на сервере несколько версий PHP (важно использовать ту же версию, что и веб-сервер, например 8.2):
Код:
*/5 * * * * /usr/bin/php8.2 /var/www/it/syscron.php >/dev/null 2>&1
Если CLI PHP недоступен (редко, но бывает в контейнерах/ограниченных окружениях) — можно дёргать по HTTP через curl/wget:
Код:
*/5 * * * * curl -s -o /dev/null https://example.com/syscron.php
CLI-вызов предпочтительнее: он не создаёт лишнего HTTP-соединения, не зависит от .htaccess/веб-сервера и не виден снаружи.
Проверить, что задача добавлена:
Код:
Логи выполнения cron (Debian/Ubuntu):
Код:
grep CRON /var/log/syslog
4. Хостинг с панелью управления (без SSH)
Практически везде есть раздел «Cron-задания» / «Планировщик задач» / «Cron Jobs».
Типовые расположения:
| Панель | Где искать |
|---|
| cPanel | Advanced → Cron Jobs |
| ISPmanager | Инструменты → Планировщик задач (Cron) |
| Plesk | Сайты / Инструменты → Расписание задач (Scheduled Tasks) |
| DirectAdmin | Advanced Features → Cron Jobs |
| VestaCP/HestiaCP | CRON JOBS (отдельный пункт в левом меню) |
| timeweb / beget / reg.ru / sprinthost и др. | обычно «Cron», «Планировщик» в разделе сайта/хостинга |
Общий алгоритм в панели:
- Найти раздел Cron Jobs / Планировщик задач.
- Указать периодичность: */5 * * * * (каждые 5 минут) — либо выбрать в конструкторе «каждые 5 минут».
- Указать команду. В панелях с поддержкой PHP CLI обычно нужно указать именно её, например:
Код:
/usr/bin/php /home/u12345/public_html/syscron.php
(путь и версию PHP уточняйте у хостинга — часто есть выбор версии PHP прямо в форме добавления Cron-задания). - Если хостинг поддерживает только вызов по URL (некоторые бюджетные тарифы) — указать полный адрес:
Код:
https://example.com/syscron.php
5. Как проверить, что cron реально работает
- Вручную запустить и посмотреть, нет ли фатальных ошибок:
Код:
(на Windows —C:\OSPanel\modules\PHP-8.2\PHP\php.exe syscron.php из папки сайта). - Проверить лог плагина nsched: engine/cache/logs/nsched.log — там должны появляться строки вида CRON execution started at ... и CRON finished: elapsed=....
- Если после ручного запуска в логе фатальная ошибка — сначала исправьте её, а потом настраивайте расписание (иначе cron будет молча падать каждый раз).
- Если запуск не даёт эффекта и лог не обновляется — проверьте flag-файлы в engine/cache/main/<...>/core/cron_*. Файл нулевого размера означает «зависший»/незавершённый запуск — он блокирует повторные запуски на 120 секунд. Удалите такой файл вручную, если уверены, что процесс больше не выполняется.
6. Частые ошибки
Cron настроен, но новости не публикуются/не снимаются.
Проверьте, что настроена именно ссылка на syscron.php, а не на index.php и не на страницу админки — они не выполняют реальную работу cron надёжно (для index.php работа зависит от посещаемости, админка вообще не вызывает$cron->run()).
Задача в панели хостинга есть, а логов нет.
Скорее всего неверный путь к PHP или к файлу syscron.php, либо сайт лежит не в public_html, а в подпапке — уточните полный путь через SSH/файловый менеджер хостинга (pwd в корне сайта).
Разное поведение локально и на сервере.
Убедитесь, что версия PHP CLI, вызываемая cron'ом, совпадает (или хотя бы совместима) с версией PHP веб-сервера — расхождения в версии иногда дают разные ошибки (как в PHP 8, где несовпадение числа аргументов у встроенных функций — фатальная ArgumentCountError, а не предупреждение).