rwkiii
Tengo un problema que no puedo resolver. Configuré un cronograma de WP personalizado y un evento cron de WP con ese cronograma. Estoy usando PHPStorm para depurar y he establecido un punto de interrupción dentro del gancho check_mail(). El punto de interrupción nunca se alcanza, sin embargo, el código dentro de check_mail() se ejecuta ya que puedo ver la entrada en mi archivo de registro (“¡Tengo que verificar_mail()!”)
Todos los demás puntos de interrupción funcionan bien y la rutina check_mail() tiene solo dos líneas de código: la escritura de registro y un retorno.
¿Cómo sucede que el código se ejecuta pero mi punto de interrupción nunca se alcanza?
En el constructor:
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 );
}
Las rutinas de apoyo:
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;
}
Las tareas de WP Cron se ejecutan en un proceso separado mediante una solicitud POST remota. PhpStrom no se detendrá en ningún punto de interrupción establecido en su código, porque el parámetro de inicio de sesión de depuración no está presente en la solicitud.
Aquí está la solución. El filtro agregará parámetros adicionales a todas las solicitudes de WP Cron. Reemplazar XDEBUG_SESSION_START valor al suyo (he usado el valor predeterminado) y coloque el código debajo de su complemento o código de tema. PhpStorm se detendrá en cualquier punto de interrupción, incluso para tareas cron.
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;
}
Ubicación del valor clave de PhpStrom IDE
¡Espero eso ayude!
-
¡Muchas gracias! He estado buscando una solución a esto durante varios días. Consulte mi respuesta a continuación para obtener una solución más general que no requiere codificar la clave IDE.
– Paul ‘Gavillón’ Biron
25 de mayo de 2017 a las 0:11
-
¡¡¡¡Gracias!!!! Resolvió mi problema. Lo loco es que mi archivo php.ini no tenía una configuración idekey, y el puerto es 9003, pero a pesar de eso, lo configuré al que pasaste aquí, y 9001, ¡y aún funciona! (Supongo que el puerto funciona debido al rango de puertos, pero no hay idekey? Supongo que ese es el pase de ID phpstorm a xdebug.
– neoswf
11 de febrero a las 17:02
Paul ‘Gavilán’ Biron
La respuesta de Pavel funcionó a las mil maravillas para mí y he estado buscando una respuesta a esto durante varios días.
Pero cuanto más lo pensaba, quería una solución más general… una en la que no tuviera que codificar una clave IDE específica.
Esto es lo que se me ocurrió:
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) ;
}
¿Dónde estás configurando el punto de interrupción? Uso mucho PHPStorm y me encanta la herramienta de depuración, pero ocasionalmente encuentro que la ubicación del punto de interrupción no funciona (por ejemplo, en ciertas partes de una matriz). También encuentro que a veces simplemente tengo que cerrar/reiniciar PHPStorm, porque los puntos de interrupción dejan de activarse/funcionar por algún motivo. TENGA EN CUENTA que TAMBIÉN codifico WP, y los puntos de interrupción, cuando funcionan correctamente, DETENEN la ejecución cuando se ejecuta a través de cron …
– nombre_usuario_aleatorio
8 dic 2016 a las 20:53
@cale_b Lo puse en check_mail() – Anoté la línea antes. La línea de código se ejecuta, pero no se alcanza el punto de interrupción. No he experimentado esto antes. Es como si el código se estuviera ejecutando en otro proceso/instanciación de la clase. ¿Hay alguna manera de depurar esta posibilidad? Por cierto, salí de PHPStorm y reinicié. No sospecho nada de PHPStorm.
– rwkiii
9 de diciembre de 2016 a las 0:27
¿Puedes hacer una captura de pantalla de tu configuración de depuración en PHPStorm y agregarla a la pregunta?
– nombre_usuario_aleatorio
9 dic 2016 a las 16:37