it-swarm.com.de

Wie führe ich alle 5 Minuten eine Funktion aus?

Ich muss alle 5 Minuten eine Funktion ausführen. Ich habe folgendes aus dem Kodex erwähnt:

<?php wp_schedule_event(time(), 'hourly', 'my_schedule_hook', $args); ?> 

Ich möchte diese Funktion nur alle 5 Minuten ausführen, unabhängig davon, wann ich anfangen soll. Wie kann ich das

Außerdem heißt es im Codex, dass cron ausgeführt wird, wenn ein Besucher die Site besucht. Gibt es eine Möglichkeit, den Cron wie pro Minute auszuführen und nicht auf einen Besuch zu warten?

nehmen wir an, die folgende Funktion sollte alle 5 Minuten ausgeführt werden. Wie kann ich das mit wp_schedule_event() oder wp_cron tun?

function run_evry_five_minutes(){
    // codes go here
}
10
Foolish Coder

Sie können über cron_schedules neue Fahrplanzeiten anlegen:

function my_cron_schedules($schedules){
    if(!isset($schedules["5min"])){
        $schedules["5min"] = array(
            'interval' => 5*60,
            'display' => __('Once every 5 minutes'));
    }
    if(!isset($schedules["30min"])){
        $schedules["30min"] = array(
            'interval' => 30*60,
            'display' => __('Once every 30 minutes'));
    }
    return $schedules;
}
add_filter('cron_schedules','my_cron_schedules');

Jetzt können Sie Ihre Funktion einplanen:

wp_schedule_event(time(), '5min', 'my_schedule_hook', $args);

Um es nur einmal zu planen, wickeln Sie es in eine Funktion ein und prüfen Sie, bevor Sie es ausführen:

$args = array(false);
function schedule_my_cron(){
    wp_schedule_event(time(), '5min', 'my_schedule_hook', $args);
}
if(!wp_next_scheduled('my_schedule_hook',$args)){
    add_action('init', 'schedule_my_cron');
}

Beachten Sie den Parameter $ args! Wenn Sie den Parameter $ args in wp_next_scheduled nicht angeben, aber $ args für wp_schedule_event haben, wird eine nahezu unendliche Anzahl desselben Ereignisses (statt nur eines) geplant.

Erstellen Sie abschließend die eigentliche Funktion, die Sie ausführen möchten:

function my_schedule_hook(){
    // codes go here
}

Ich denke, es ist wichtig zu erwähnen, dass wp-cron den Zeitplan überprüft und fällige geplante Jobs jedes Mal ausführt, wenn eine Seite geladen wird.

Wenn Sie also eine verkehrsarme Website haben, die nur 1 Besucher pro Stunde hat, wird wp-cron nur ausgeführt, wenn dieser Besucher Ihre Website durchsucht (einmal pro Stunde). Wenn Ihre Website mit vielen Besuchern pro Sekunde eine Seite anfordert, wird wp-cron jede Sekunde ausgelöst, wodurch der Server zusätzlich belastet wird.

Die Lösung besteht darin, wp-cron zu deaktivieren und über einen echten cron-Job in dem Zeitintervall auszulösen, in dem Sie den geplanten wp-cron-Job am schnellsten wiederholen (in Ihrem Fall 5 Minuten).

Lucas Rolff erklärt das Problem und gibt die Lösung im Detail.

Alternativ können Sie einen kostenlosen Drittanbieter-Service wie UptimeRobot verwenden, um Ihre Site alle 5 Minuten abzufragen (und wp-cron auszulösen), wenn Sie wp-cron nicht deaktivieren und über ein echtes cron auslösen möchten Job.

23
Johano Fierra

Wenn Ihre Site stark frequentiert wird, können Sie versuchen, sie (ungefähr) alle 5 Minuten mit set_transient() auszuführen, z. B .:

function run_every_five_minutes() {
    // Could probably do with some logic here to stop it running if just after running.
    // codes go here
}

if ( ! get_transient( 'every_5_minutes' ) ) {
    set_transient( 'every_5_minutes', true, 5 * MINUTE_IN_SECONDS );
    run_every_five_minutes();

    // It's better use a hook to call a function in the plugin/theme
    //add_action( 'init', 'run_every_five_minutes' );
}
2
bonger

Sie können es in der Plugin-Aktivierung auslösen, anstatt bei jedem Plugin-Aufruf:

//Add a utility function to handle logs more nicely.
if ( ! function_exists('write_log')) {
    function write_log ( $log )  {
        if ( is_array( $log ) || is_object( $log ) ) {
            error_log( print_r( $log, true ) );
        } else {
            error_log( $log );
        }
    }
}

/**
 * Do not let plugin be accessed directly
 **/
if ( ! defined( 'ABSPATH' ) ) {
    write_log( "Plugin should not be accessed directly!" );
    exit; // Exit if accessed directly
}

/**
 * -----------------------------------------------------------------------------------------------------------
 * Do not forget to trigger a system call to wp-cron page at least each 30mn.
 * Otherwise we cannot be sure that trigger will be called.
 * -----------------------------------------------------------------------------------------------------------
 * Linux command:
 * crontab -e
 * 30 * * * * wget http://<url>/wp-cron.php
 */

/**
 * Add a custom schedule to wp.
 * @param $schedules array The  existing schedules
 *
 * @return mixed The existing + new schedules.
 */
function woocsp_schedules( $schedules ) {
    write_log("Creating custom schedule.");
    if ( ! isset( $schedules["10s"] ) ) {
        $schedules["10s"] = array(
            'interval' => 10,
            'display'  => __( 'Once every 10 seconds' )
        );
    }

    write_log("Custom schedule created.");
    return $schedules;
}

//Add cron schedules filter with upper defined schedule.
add_filter( 'cron_schedules', 'woocsp_schedules' );

//Custom function to be called on schedule triggered.
function scheduleTriggered() {
    write_log( "Scheduler triggered!" );
}
add_action( 'woocsp_cron_delivery', 'scheduleTriggered' );

// Register an activation hook to perform operation only on plugin activation
register_activation_hook(__FILE__, 'woocsp_activation');
function woocsp_activation() {
    write_log("Plugin activating.");

    //Trigger our method on our custom schedule event.
    if ( ! wp_get_schedule( 'woocsp_cron_delivery' ) ) {
        wp_schedule_event( time(), '10s', 'woocsp_cron_delivery' );
    }

    write_log("Plugin activated.");
}

// Deactivate scheduled events on plugin deactivation.
register_deactivation_hook(__FILE__, 'woocsp_deactivation');
function woocsp_deactivation() {
    write_log("Plugin deactivating.");

    //Remove our scheduled hook.
    wp_clear_scheduled_hook('woocsp_cron_delivery');

    write_log("Plugin deactivated.");
}
2

Ich fürchte, außer darauf zu warten, dass jemand Ihre Site besucht, auf der eine Funktion ausgeführt wird, besteht die einzige andere Möglichkeit darin, einen Cron-Job auf Ihrem Server mit etwas wie folgendem einzurichten: https://stackoverflow.com/questions/878600/how-to-create-cronjob-using-bash oder wenn Sie eine Oberfläche im Cpanel-Stil auf Ihrem Server haben, gibt es manchmal eine GUI zum Einrichten.

1
Andrew Welch

Mit dem Cronjob Scheduler Plugin können Sie häufige Aufgaben zuverlässig und zeitnah ausführen, ohne dass jemand Ihre Site besuchen muss. Sie benötigen lediglich 1 Aktion und einen Unix Crontab-Zeitplan.

Es ist sehr einfach zu bedienen und sehr flexibel. Sie erstellen eine eigene Funktion und definieren darin eine Aktion. Dann können Sie Ihre Aktion aus dem Plugin-Menü auswählen und sie starten, wann immer Sie möchten.

1
Marco

Die richtige Antwort von @ johano erklärt, wie ein benutzerdefiniertes Intervall für WP Cron-Job eingerichtet wird. Die zweite Frage wird jedoch nicht beantwortet. So wird jede Minute ein Cron ausgeführt:

  1. Fügen Sie in der Datei wp-config.php den folgenden Code hinzu:

    define('DISABLE_WP_CRON', true);
    
  2. Einen Cron-Job hinzufügen (crontab -e unter Unix/Linux):

    1 * * * * wget -q -O - http://example.com/wp-cron.php?doing_wp_cron
    

Der erste Teil (Schritt 1) ​​deaktiviert den internen Cron-Job von WordPress. Im zweiten Teil (Schritt 2) wird der WordPress-Cron-Job jede Minute manuell ausgeführt.

Mit der Antwort von @ Johano (Ausführen eines Tasks alle 5 Minuten) und meiner (Manuelles Ausführen des Cron) sollten Sie in der Lage sein, Ihr Ziel zu erreichen.

0
Mike

Ich habe eine mögliche Lösung mit einer Schedule-Funktion und einer rekursiven WP Ajax-Funktion.

  1. Erstellen Sie ein Zeitplanereignis von 60 Minuten, um eine Funktion auszuführen
  2. Diese Funktion löst eine rekursive Funktion mit Ajax durch file_get_contents() aus.
  3. Die Ajax-Funktion verfügt über einen Zähler in der Datenbank mit einer Gesamtzahl von 60 (für jede Minute innerhalb der Stunde).
  4. Diese Ajax-Funktion überprüft Ihren Zähler auf:

Wenn der Zähler gleich oder höher als 60 ist, wird der Zähler zurückgesetzt und auf den nächsten Cron-Job gewartet.

Wird ein Vielfaches von 5 (also alle 5 Minuten) gezählt, wird die gewünschte Funktion ausgeführt

Und abgesehen von den Bedingungen wird es 59 Sekunden lang schlafen sleep(59); (vorausgesetzt, Ihre Funktion ist eine schnelle). Nach dem Ruhezustand löst es sich mit file_get_contents()again aus.

Wichtige Dinge zu beachten:

  1. Erstellen Sie eine Möglichkeit, den Prozess zu unterbrechen (d. H. Einen Wert in der Datenbank zu überprüfen).
  2. Erstellen Sie eine Möglichkeit, um zwei Prozesse gleichzeitig zu verhindern
  3. Setzen Sie bei file_get_contents das Zeitlimit für den Header auf 2 oder 3 Sekunden, da der Server sonst möglicherweise verschiedene Prozesse hat, die auf nichts warten
  4. Möglicherweise möchten Sie mit set_time_limit(90); verhindern, dass der Server Ihre Funktion vor dem Ruhezustand unterbricht

Es ist eine Lösung, keine gute, und sie wird möglicherweise vom Server blockiert. Mit einem externen Cron können Sie eine einfache Funktion festlegen. Der Server verwendet die Ressourcen alle 5 Minuten einmal. Mit dieser Lösung verwendet der Server die ganze Zeit Ressourcen.

0
Bruno Cantuaria