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

14

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 tun wp_cron?

function run_evry_five_minutes(){
    // codes go here
}
Dummer Coder
quelle
Sie besseren Blick in zB Linux cron oder 3rd - Party - cron Dienste , wenn Sie benötigen ein so kurzes Intervall und Genauigkeit,
birgire
Die Website ist stark frequentiert. Daher muss das Zeitintervall nicht berücksichtigt werden. Sicher, dass es alle 2 oder 3 Minuten ausgelöst wird. Kunden bevorzugen es abfunctions.php
Foolish Coder
Es ist nicht möglich, eine PHP-Datei auszulösen, ohne dass etwas mit einem Timer auf dem Server läuft.
Andrew Welch
Datei? es handelt sich um eine funktion in functions.php
Foolish Coder
Denken Sie, ein kostenloser Überwachungsdienst könnte der Ping sein, der CRON auslöst? newrelic.com/server-monitoring
jgraup

Antworten:

27

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, schließen 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 bei jedem Laden einer Seite den Zeitplan überprüft und fällige geplante Jobs ausführt.

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 es über einen echten cron-Job auslösen möchten.

Johano Fierra
quelle
2

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

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' );
}
Bonger
quelle
Nun,
ähm
Ja, es funktioniert NICHT. Ich habe folgenden Code verwendet, functions.phpwenn ein Besuch auf der Seite stattfindet. Eine Tabelle in meiner Datenbank wird aktualisiert function run_evry_five_minutes() { $homepage = file_get_contents('link to visit'); echo $homepage; }. Die DB-Tabelle wird jedoch auch nach 6 Minuten nicht aktualisiert.
Foolish Coder
Sie wissen nicht , warum es nicht für Sie arbeiten , aber denken eigentlich , wenn ich nur mit get_transient()/ set_transient()ohne cron Sachen macht viel mehr Sinn, viel einfacher wird Antwort aktualisieren ...
Bonger
@bonger ist das eine gute Alternative für wp_schedule_event ()?
Marko Kunic
@ MarkoKunić Weiß nicht ehrlich zu sein, habe es nicht ausprobiert ... es wurde nur als Workaround angeboten, aber wenn Sie es ausprobieren, lassen Sie es uns wissen ...! (Johano Fierra Antwort sieht gut aus wordpress.stackexchange.com/a/216121/57034 )
Bonger
2

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.");
}
Régis Ramillien
quelle
1

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 so etwas wie /programming/878600/how einzurichten -to-create-cronjob-using-bash oder wenn Sie eine Oberfläche im Cpanel-Stil auf Ihrem Server haben, gibt es manchmal eine GUI, um dies einzurichten.

Andrew Welch
quelle
Ja, ich verstehe das. Ich habe bereits einige Cron aus cPnael erstellt. Aber jetzt versuche ich, eine Funktion auszuführen, functions.phpda wir Clients nicht bitten können, ein Cron aus cpanel einzurichten, wenn sich die Funktion in a pluginoder in functions.phpbefindet auf eigene Faust ..
Foolish Coder
1

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 Ihre 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.

Marco
quelle
0

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 mit Ajax through eine rekursive Funktion aus file_get_contents()
  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.

Wenn der Zähler ein Vielfaches von 5 ist (also alle 5 Minuten), wird die gewünschte Funktion ausgeführt

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

Wichtige Dinge zu beachten:

  1. Erstellen Sie eine Möglichkeit, den Prozess zu unterbrechen (dh 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. Verwenden Sie die set_time_limit(90);, um zu 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 einstellen. Der Server verwendet die Ressourcen alle 5 Minuten einmal. Mit dieser Lösung verwendet der Server die ganze Zeit Ressourcen.

Bruno Cantuaria
quelle
0

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

  1. Fügen Sie der Datei wp-config.phpden folgenden Code hinzu:

    define('DISABLE_WP_CRON', true);
  2. Einen Cron-Job hinzufügen ( crontab -eunter 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.

Mike
quelle