Поддержка Проблемы и решения Не запускается функция по крону

  • Решено artem78

    (@artem78)


    Пишу парсер с возможностью запуска по расписанию. Для этого в опции добавил соответствущую галочку.

    function bgp_add_options_page() {
        add_options_page('Настройки парсера', 'Настройки парсера', 8, 'bgp_settings_page', 'bgp_options_page');
    }
    add_action('admin_menu', 'bgp_add_options_page');
    
    function bgp_register_settings() {
        add_settings_section('bgp_settings_section', '', '', __FILE__);
    
        register_setting('bgp_settings_group', 'bgp_auto_parse_enable', 'bgp_settings_scheduler');
    
        $field_params = array(
            'name' => 'bgp_auto_parse_enable',
            'type' => 'checkbox'
        );
        add_settings_field('bgp_auto_parse_enable', 'Включить автоматический парсинг', 'bgp_display_settings', __FILE__, 'bgp_settings_section', $field_params);
    }
    add_action('admin_init', 'bgp_register_settings');
    
    function bgp_display_settings($params) {
        extract($params);
        $val = get_option($name);
    
        switch($type) {
            case 'checkbox':
                $checked = $val ? 'checked="checked"' : '';
                echo "<input type=\"checkbox\" name=\"$name\" $checked />";
                break;
        }
    }
    
    function bgp_settings_sanitize_checkbox($input) {
        return $input == 'on' ? 1 : 0;
    }
    
    function bgp_settings_scheduler($input) {
        $input = bgp_settings_sanitize_checkbox($input);
        if ($input) {
            if (!wp_next_scheduled('bgp_new_posts_scheduler')) {
                wp_schedule_event(time() + 10, 'ten_min', 'bgp_new_posts_scheduler');
            }
        } else {
            if (wp_next_scheduled('bgp_new_posts_scheduler')) {
                wp_clear_scheduled_hook('bgp_new_posts_scheduler');
            }
        }
        return $input;
    }
    
    function bgp_options_page() {
    ?>
        <div class="wrap">
            <h2>Настройки</h2>
            <br />
            <form action="options.php" method="post">
                <?php settings_fields('bgp_settings_group'); ?>
                <?php do_settings_sections(__FILE__); ?>
                <?php submit_button(); ?>
            </form>
        </div>
    <?php
    }
    
    function bgp_get_new_posts() {
    if (!wp_next_scheduled('bgp_new_posts_scheduler')) {
            wp_schedule_event(time() + 10, 'ten_min', 'bgp_new_posts_scheduler');
        }
    
        /// ... основная работа ...
    
    }
    
    add_filter( 'cron_schedules', 'cron_add_ten_min' );
    function cron_add_ten_min( $schedules ) {
        $schedules['ten_min'] = array(
            'interval' => 60 * 10,
            'display' => 'Раз в 10 минут'
        );
        return $schedules;
    }
    
    add_action('bgp_new_posts_scheduler', 'bgp_get_new_posts');

    Но автозапуск не работает. Подумал, может быть не работает wp cron, отключил его

    define('DISABLE_WP_CRON', true);
    define('ALTERNATE_WP_CRON', false);

    а в crontab добавил:
    */1 * * * * php5 -q /home/artem/www/wordpress/wp-cron.php

    и так
    */1 * * * * wget -q -O — http://localhost/wordpress/wp-cron.php?doing_wp_cron >/dev/null 2>&

    Не помогло. Проблема в кроне или я событие неправильно создаю? Помогите пожалуйста разобраться.

Просмотр 4 ответов — с 1 по 4 (всего 4)
  • Модератор Yuri

    (@yube)

    wp_schedule_event устанавливает хук, который будет вызываться с заданным интервалом, а хук в свою очередь запускает обработчик. В коде я не вижу add_action('dobgp_new_posts_scheduler', ...).

    Нет смысла постоянно вызывать wp_schedule_event() для регулярных задач, достаточно один раз при инициализации плагина. Посмотрите пример в Кодексе http://codex.wordpress.org/Function_Reference/wp_schedule_event

    В коде я не вижу add_action(‘dobgp_new_posts_scheduler’, …).

    как же, самая последняя строчка

    Модератор Yuri

    (@yube)

    Да, точно, извините, не заметил. Читать большие портянки тут чертовски не удобно, поэтому Правила и рекомендуют пользоваться pastebin.com.

    Ну что я могу посоветовать? «Делай как я», как пели Кар-мэн 🙂 Вот намедни писал плагинище с хроном. Поставил https://wordpress.org/plugins/advanced-cron-manager/ чтобы 1) убедиться, что хрон заряжен и 2) быть в курсе, когда наступит следующее выполнение. Затем в сам обработчик добавил отправку себе простого письма, чтобы видеть, что что-то вообще происходит. Затем, по мере написания кода, добавлял важную инфу в текст этого отладочного письма. Ну и одним глазом смотрел на лог ошибок — на всякий случай.

    Спасибо за советы. Выполнил в консоли
    php5 -q /home/artem/www/wordpress/wp-cron.php
    и увидел, что происходит fatal error и из-за него не запускалась задача.

Просмотр 4 ответов — с 1 по 4 (всего 4)
  • Тема «Не запускается функция по крону» закрыта для новых ответов.