WP-Cron-Ereignis wird ausgelöst, erreicht aber beim Debuggen keinen Haltepunkt

Lesezeit: 4 Minuten

Benutzer-Avatar
rwkiii

Ich habe ein Problem, das ich nicht herausfinden kann. Ich habe einen benutzerdefinierten WP-Cron-Zeitplan und ein WP-Cron-Ereignis mit diesem Zeitplan eingerichtet. Ich verwende PHPStorm zum Debuggen und habe einen Haltepunkt innerhalb des Hakens check_mail() gesetzt. Der Haltepunkt wird nie erreicht, aber der Code in check_mail() wird ausgeführt, da ich den Eintrag in meiner Protokolldatei sehen kann (“Got to check_mail()!”)

Alle anderen Breakpoints funktionieren einwandfrei und die Routine check_mail() enthält nur zwei Codezeilen – das Schreiben des Protokolls und eine Rückgabe.

Wie kommt es, dass der Code läuft, aber mein Breakpoint nie erreicht wird?

Im Konstruktor:

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 );
}

Die unterstützenden Routinen:

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;
    }

  • Wo setzt du den Haltepunkt? Ich verwende PHPStorm viel und liebe das Debugging-Tool, aber gelegentlich stelle ich fest, dass die Breakpoint-Platzierung nicht funktioniert (z. B. an bestimmten Teilen eines Arrays). Ich finde auch, dass ich PHPStorm manchmal einfach beenden/neu starten muss, weil Breakpoints aus irgendeinem Grund aufhören zu feuern/funktionieren. BEACHTEN SIE, dass ich AUCH WP codiere und die Haltepunkte – wenn sie ordnungsgemäß funktionieren – die Ausführung stoppen, wenn sie über cron ausgeführt werden …

    – zufälliger_Benutzername

    8. Dezember 2016 um 20:53 Uhr


  • @cale_b Ich habe es in check_mail() eingefügt – ich habe die Zeile vorher notiert. Die Codezeile wird ausgeführt, aber der Haltepunkt wird nicht erreicht. Ich habe das noch nie erlebt. Es ist, als würde der Code in einem anderen Prozess/einer Instanziierung der Klasse ausgeführt. Gibt es eine Möglichkeit, diese Möglichkeit zu debuggen? Übrigens, ich habe PHPStorm beendet und neu gestartet. Ich vermute PHPStorm überhaupt nicht.

    – rwkiii

    9. Dezember 2016 um 0:27 Uhr

  • Können Sie Ihre Debug-Einstellungen in PHPStorm scannen und sie der Frage hinzufügen?

    – zufälliger_Benutzername

    9. Dezember 2016 um 16:37 Uhr

WP Cron-Tasks werden per Remote-POST-Anforderung auf einem separaten Prozess ausgeführt. PhpStrom stoppt an keinem Haltepunkt, der in Ihrem Code festgelegt ist, da der Debug-Session-Startparameter in der Anfrage nicht vorhanden ist.

Hier ist die Lösung. Der Filter fügt allen WP-Cron-Anfragen zusätzliche Parameter hinzu. Ersetzen XDEBUG_SESSION_START Wert zu Ihrem (ich habe Standard verwendet) und fügen Sie den folgenden Code in Ihren Plugin- oder Themencode ein. PhpStorm stoppt an jedem Haltepunkt, selbst für Cron-Tasks.

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;

}

Speicherort des PhpStrom-IDE-Schlüsselwerts

Ich hoffe es hilft!

  • Danke sehr! Ich suche seit mehreren Tagen nach einer Lösung für dieses Problem. Siehe meine Antwort unten für eine allgemeinere Lösung, die keine Hartcodierung des IDE-Schlüssels erfordert.

    – Paul ‘Sperber’ Biron

    25. Mai 2017 um 0:11 Uhr

  • Vielen Dank!!!! Mein Problem gelöst. Das Verrückte ist, dass meine php.ini-Datei keine idekey-Konfiguration hatte und der Port 9003 ist, aber obwohl ich ihn so konfiguriert habe, wie Sie ihn hier übergeben haben, und 9001, und es funktioniert immer noch! (Ich schätze, die Port-Warks sind die Ursache für den Port-Bereich, aber kein idekey? Ich schätze, das ist die ID, die phpstorm an xdebug weitergibt.

    – neoswf

    11. Februar um 17:02 Uhr

Benutzer-Avatar
Paul ‘Sperber’ Biron

Pavels Antwort hat bei mir wie ein Zauber gewirkt und ich habe mehrere Tage nach einer Antwort darauf gesucht.

Aber je länger ich darüber nachdachte, desto mehr wollte ich eine allgemeinere Lösung … eine, bei der ich keinen bestimmten IDE-Schlüssel fest codieren musste.

Das ist mir eingefallen:

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) ;
}

1373160cookie-checkWP-Cron-Ereignis wird ausgelöst, erreicht aber beim Debuggen keinen Haltepunkt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy