WP cron事件触发,但在调试

时间:2016-12-08 19:09:22

标签: php wordpress

我遇到了一个我无法弄清楚的问题。我已经设置了一个自定义的WP cron时间表和一个带有该时间表的WP cron事件。我正在使用PHPStorm进行调试,并且我在check_mail()钩子中设置了一个断点。断点永远不会被击中,但check_mail()中的代码会被执行,因为我可以看到我的日志文件中的条目(“Got to check_mail()!”)

所有其他断点都正常工作,check_mail()例程中只有两行代码 - 日志写入和返回。

代码如何运行但我的断点永远不会被命中?

在构造函数中:

add_action( 'check_mail', array($this, 'check_mail' ), 10, 0);

if ( !defined( 'DOING_AJAX' ) || !DOING_AJAX ) {
    add_action( 'init', array( $this, 'schedule_wp_cron' ), 10, 0 );
}

支持程序:

public function schedule_wp_cron()
{
    /**
     * Avoid rescheduling cron if it's already scheduled.
     */

    $args = array( );

    if ( !wp_next_scheduled( 'check_mail' )) {

        /**
         * Schedule mail server polling.
         */
        wp_schedule_event( time(), 'custom_interval', 'check_mail');

        }

    }

    public function check_mail( )
    {

        // **BREAKPOINT SET ON NEXT LINE**
        write_log( 'emails', 'Got to check_mail()!' );

        //... do something ...

        return;

    }


    public function custom_cron_schedule( $schedules )
    {

        $schedules[ 'custom_interval' ] = array(
            'interval' => 300,
            'display'  => 'Custom Interval',
        );

        return $schedules;
    }

2 个答案:

答案 0 :(得分:3)

WP Cron任务通过远程POST请求在单独的进程上运行。 PhpStrom不会在代码中设置的任何断点处停止,因为请求中不存在调试会话启动参数。

这是解决方案。 Filter将为所有WP Cron请求添加额外的参数。将 XDEBUG_SESSION_START 值替换为您的(我已使用默认值),并将下面的代码放入您的插件或主题代码中。即使对于cron任务,PhpStorm也会在任何断点处停止。

add_filter( 'cron_request', 'wp_cron_debug', 10, 2 );
function wp_cron_debug( $args, $doing_cron ) {

    $args['url'] = add_query_arg( array(
        'XDEBUG_SESSION_START' => 'PHPSTORM' // <== replace PHPSTORM with your key
    ), $args['url'] );

    return $args;

}

PhpStrom IDE key value location

希望它有所帮助!

答案 1 :(得分:0)

Pavel's回答对我来说就像一个魅力,我已经好几天都在寻找答案了。

但是我想的越多,我就想要一个更通用的解决方案......其中我没有必要对特定的IDE Key进行硬编码。

这就是我提出的:

add_action ('cron_request', 'so_add_cron_xdebug_cookie', 10, 2) ;

/**
 * Allow debugging of wp_cron jobs
 *
 * @param array $cron_request_array
 * @param string $doing_wp_cron
 *
 * @return array $cron_request_array with the current XDEBUG_SESSION cookie added if set
 */
function
so_add_cron_xdebug_cookie ($cron_request_array, $doing_wp_cron)
{
    if (empty ($_COOKIE['XDEBUG_SESSION'])) {
        return ($cron_request_array) ;
        }

    if (empty ($cron_request_array['args']['cookies'])) {
        $cron_request_array['args']['cookies'] = array () ;
        }
    $cron_request_array['args']['cookies']['XDEBUG_SESSION'] = $_COOKIE['XDEBUG_SESSION'] ;

    return ($cron_request_array) ;
}