phpbb и системный cron

Post Reply
User avatar
Ganzal
Admin
Posts: 205
Joined: 2008-06-04 03:57:55, Wed
Location: Moscow
Contact:

phpbb и системный cron

Post by Ganzal » 2015-02-28 22:20:05, Sat

Задача
Запускать встроенный в phpBB планировщик не дожидаясь посетителей на форуме.


История
Так повелось, что phpBB внимательно следит за своим планировщиком, внедряя в нужный момент в исходный код страницы ссылку на картинку с адресом /cron.php и аргументом, указывающим на желаемую запланированную процедуру. Одну за раз. У этого способа есть пара очевидных недостатков:
  • малопосещаемый форум (вроде этого клозета) будет очень-очень редко пробуждать планировщик и некоторые очень полезные функции будут ожидать своей очереди практически бесконечно долго.
  • поисковые боты не запускают крон. Очевидно, доска не "показывает" им ссылку на картинку планировщика.
  • боты ёбаных спамеров (tm) вообще ничего кроме атакуемых скриптов не посещают.
Все эти факторы влияют на такую простую функциональность форума, как отправка потовых уведомлений. И на другие тоже.


Решение
Через cron вызывать wget с адресом планировщика форума, указывая желаемую для выполнения процедуру.

  1. Создаем список типичных процедур форума phpBB:

    Code: Select all

    $ touch /home/user/forum-cron.tasks

  2. Открываем список типичный процедур форума phpBB любимым редактором.
  3. Вставляем список... ну вы поняли:

    Code: Select all

    # cron.task.core.tidy_search
    # cron.task.core.tidy_cache
    cron.task.core.tidy_sessions
    # cron.task.core.tidy_warnings
    # cron.task.core.tidy_database
    # cron.task.core.prune_notifications
    cron.task.core.queue
    Шарпы в начале строк "комментируют" имя процедуры, исключая её выполнение.

  4. Сохраняем-закрываем.
  5. Создаем простой Bash-сценарий и делаем его исполняемым:

    Code: Select all

    $ touch /home/user/forum-cron.bash && chmod +x /home/user/forum-cron.bash

  6. Наполняем содержанием:

    Code: Select all

    #!/bin/bash

    TASKS=`cat $(dirname $0)/forum-cron.tasks`;
    FORUM_CRON_URL_PREFIX=http://example.com/forum/cron.php?cron_type=
    SLEEPTIME=0;

    for TASK in `echo "${TASKS}" | grep -v '^#'`; do
        sleep $SLEEPTIME;
        SLEEPTIME=5;
        wget -qO - ${FORUM_CRON_URL_PREFIX}${TASK} > /dev/null;
    done
    Логика простая:
    • Прочитали файл со списком процедур.
    • В цикле вызываем URL процедуры, которая естественно не была закомментирована диезом (шарпом, #).
    • Делаем 5 секунд паузы между вызовами.
  7. Осталось закинуть в системный планировщик.
    • Открываем свой:

      Code: Select all

      $ crontab -e
      Или
    • Открываем чужой:

      Code: Select all

      # crontab -u login -e
  8. Планировщик будет запускать сценарий запуска планировщика каждые пять минут начиная с первой (второй!) (это 01,06,11,16,21,26,31,36,41,46,51,56):

    Code: Select all

    01-56/5 *   * * * /home/user/forum-cron.bash
Всё. Теперь каждые n-минут форум будет "посещен" самим сервером.


Лирическое отступление
Прочитали? Сделали?
Удаляйте нафиг!
Начиная с версии 3.1 доска имеет консольную точку входа. Лежит она в файле /bin/phpbbcli.php относительно каталога установки конференции. Запуск сценария без аргументов или с привычным флагом --help подробнее расскажет как им можно пользоваться. Нам достаточно только одного ключа - cron:run

Открываем кронтаб (см выше как свою и как чужую) и заменяем строку нашего велосипеда на человеческую:

Code: Select all

1-56/5 * * * * cd /var/www/path/to/forum/bin/ && /usr/bin/php -f ./phpbbcli.php cron:run
Поправьте путь установки конференции и/или расположения исполняемого файла php если я не угадал.

Всё. Вот теперь как у людей.


Подвальчик СЭО
phpbb cron linux crontab command line interface cron.php cli

Post Reply