我遇到了一个我无法弄清楚的问题。我已经设置了一个自定义的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;
}
答案 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) ;
}