Уважаемые пользователи!
C 7 ноября 2020 года phpBB Group прекратила выпуск обновлений и завершила дальнейшее развитие phpBB версии 3.2.
С 1 августа 2024 года phpBB Group прекращает поддержку phpBB 3.2 на официальном сайте.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.2 до 31 декабря 2024 года.
С учетом этого, настоятельно рекомендуется обновить конференции до версии 3.3.

Cron: некоторые тонкости

Форум для авторов расширений для phpBB. Здесь можно попросить помощи в разработке у коллег.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Мини [FAQ] по phpBB3.1.x/3.3.x | FAQ | Как задавать вопросы | Как устанавливать расширения

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
Nekstati
Поддержка
Поддержка
Сообщения: 3336
Стаж: 15 лет 1 месяц
Благодарил (а): 25 раз
Поблагодарили: 590 раз

Cron: некоторые тонкости

Сообщение Nekstati »

Некая крон-задача без проблем выполнялась через штатный псевдокрон (который при переходе по ссылкам), но не выполнялась через системный крон (который bin/phpbbcli.php) и ставила cron_lock. Ошибки нигде не фиксировались.

Выяснилось, что когда задача выполняется из-под системного (именно системного) крона, массив $user->data пустой, а точнее состоит из единственного элемента - ['user_id' => 1]. Соответственно, ошибка возникала на первом же SQL-запросе, который хотел записать, к примеру, 'username' или 'user_colour'. Ну а поскольку mysqli_query() в phpBB вызывается через @, в логах было пусто.

Повторяется легко:
- берём любое расширение с кроном
- в метод run() добавляем строчку error_log(print_r($this->user->data, true));
- в базе данных при необходимости уменьшаем значение ***_last_gc, чтобы задачу активировать
- дёргаем bin/phpbbcli.php cron:run (через системный крон или вручную через консоль)
- в логе видим:

Код: Выделить всё

Array
(
    [user_id] => 1
)
 
Выход такой: если крон-задача использует объект $user, на случай вызова задачи через системный крон необходимо добавить в неё следующее:

Код: Выделить всё

if (!$this->user->is_setup()) {
	$this->user->session_begin();
	$this->auth->acl($this->user->data);
	$this->user->setup();
}

Вернуться в «Для разработчиков»