Jak uruchomić funkcję co 5 minut?

15

Mam funkcję do uruchomienia co 5 minut. Odniosłem się z następującego kodeksu:

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

Chcę uruchamiać tę funkcję co 5 minut, niezależnie od tego, kiedy zacząć. Jak mogę to zrobić?

Również kodeks mówi, że cron zostanie uruchomiony, gdy odwiedzający odwiedzi witrynę. Czy jest jakiś sposób na uruchomienie crona tak samo jak na minuty i nie czekanie na wizytę?

powiedzmy, że następującą funkcję należy uruchamiać co 5 minut. Jak mogę to zrobić za pomocą wp_schedule_event()lub wp_cron?

function run_evry_five_minutes(){
    // codes go here
}
Głupi koder
źródło
Lepiej zajrzyj np. Do Linux cron lub zewnętrznych usług cron, jeśli potrzebujesz tak krótkiego odstępu czasu i dokładności,
birgire
strona ma duży ruch .. więc nie trzeba brać pod uwagę interwału czasowego .. na pewno będzie on uruchamiany co 2 lub 3 minuty .. klienci wolą to robićfunctions.php
Foolish Coder
nie jest możliwe wyzwolenie pliku php bez czegoś uruchomionego na serwerze z zegarem.
Andrew Welch,
plik? mówimy o funkcji w functions.php
Foolish Coder,
Czy uważasz, że bezpłatna usługa monitorowania może być pingiem, który uruchamia CRON? newrelic.com/server-monitoring
jgraup 30.01.2016

Odpowiedzi:

28

Możesz utworzyć nowy harmonogram według cron_schedules:

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

Teraz możesz zaplanować swoją funkcję:

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

Aby zaplanować tylko raz, zawiń go w funkcję i sprawdź przed uruchomieniem:

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

Zwróć uwagę na parametr $ args! Brak określenia parametru $ args w wp_next_scheduled, ale posiadanie $ args dla wp_schedule_event, spowoduje zaplanowanie prawie nieskończonej liczby tego samego zdarzenia (zamiast tylko jednego).

Na koniec utwórz rzeczywistą funkcję, którą chcesz uruchomić:

function my_schedule_hook(){
    // codes go here
}

Myślę, że należy wspomnieć, że wp-cron sprawdza harmonogram i wykonuje zaplanowane zadania za każdym razem, gdy strona jest ładowana.

Tak więc, jeśli masz witrynę o niskim natężeniu ruchu, która ma tylko 1 gościa na godzinę, wp-cron będzie działał tylko wtedy, gdy ten użytkownik będzie przeglądał twoją stronę (raz na godzinę). Jeśli masz witrynę o dużym ruchu, odwiedzający co sekundę żądają strony, wp-cron będzie uruchamiany co sekundę, powodując dodatkowe obciążenie serwera.

Rozwiązaniem jest dezaktywacja wp-cron i uruchomienie go za pomocą prawdziwego zadania cron w przedziale czasowym najszybszego powtarzania zaplanowanego zadania wp-cron (w twoim przypadku 5 minut).

Lucas Rolff wyjaśnia problem i szczegółowo opisuje rozwiązanie.

Alternatywnie możesz skorzystać z bezpłatnej usługi innej firmy, takiej jak UptimeRobot, aby sprawdzać witrynę (i wyzwalać wp-cron) co 5 minut, jeśli nie chcesz dezaktywować wp-cron i uruchamiać go za pomocą prawdziwego zadania cron.

Johano Fierra
źródło
2

Jeśli Twoja witryna ma duży ruch, możesz spróbować set_transient()uruchomić ją (bardzo w przybliżeniu) co 5 minut, np .:

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
źródło
Cóż, tak ?! ...
bonger
tak., to NIE działa .. użyłem następującego kodu functions.phppodczas wizyty na stronie, aktualizacja tabeli zostanie wykonana w mojej bazie danych function run_evry_five_minutes() { $homepage = file_get_contents('link to visit'); echo $homepage; }. Ale tabela DB nie jest aktualizowana nawet po 6 minutach.
Foolish Coder,
Nie wiem, dlaczego to dla ciebie nie działa, ale myślenie o tym po prostu przy użyciu get_transient()/ set_transient()bez crona ma znacznie więcej sensu, o wiele prostsze, zaktualizuje odpowiedź ...
bonger
@ bonger to dobra alternatywa dla wp_schedule_event ()?
Marko Kunic,
@ MarkoKunić Nie wiem szczerze, nie próbowałem tego ... było to tylko obejście, ale jeśli spróbujesz, daj nam znać ...! (Odpowiedź Johano Fierry wygląda dobrze na wordpress.stackexchange.com/a/216121/57034 )
bonger
2

Możesz aktywować go podczas aktywacji wtyczki zamiast przy każdym wywołaniu wtyczki:

//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
źródło
1

Obawiam się, że oprócz czekania, aż ktoś odwiedzi Twoją witrynę, na której działa funkcja, jedyną inną opcją jest skonfigurowanie zadania cron na serwerze przy użyciu czegoś takiego: /programming/878600/how -to-create-cronjob-using-bash lub jeśli masz na swoim serwerze interfejs w stylu cpanel, czasem jest jakiś GUI do skonfigurowania tego.

Andrew Welch
źródło
tak,. Rozumiem, że .. Mam już kilka cronów utworzonych z cPnael .. ale teraz próbuję uruchomić funkcję, functions.phpponieważ gdy funkcja jest w pluginlub w, functions.phpnie możemy prosić klientów o skonfigurowanie crona z cpanel na własną rękę ..
Foolish Coder
1

Cronjob Harmonogram Wtyczka pozwala na uruchamianie częste zadania rzetelnie i terminowo, bez nikogo konieczności odwiedzania witryny, co potrzebne jest co najmniej 1 akcja i harmonogram Unix Crontab.

Jest bardzo łatwy w użyciu i bardzo elastyczny. Tworzysz własną funkcję i definiujesz w niej akcję. Następnie możesz wybrać akcję z menu wtyczki i uruchomić ją w dowolnym momencie.

Marco
źródło
0

Mam możliwe rozwiązanie za pomocą funkcji harmonogramu i rekurencyjnej funkcji WP Ajax.

  1. Utwórz wydarzenie zaplanowane na 60 minut, aby uruchomić funkcję
  2. Ta funkcja uruchomi funkcję rekurencyjną za pomocą Ajax poprzez file_get_contents()
  3. Funkcja ajax będzie miała licznik w bazie danych o łącznej liczbie 60 (na każdą minutę w ciągu godziny).
  4. Ta funkcja ajax sprawdzi twój licznik do:

Jeśli licznik jest równy lub wyższy niż 60, resetuje licznik i oczekuje na następne zadanie cron.

Jeśli licznik wielokrotności 5 (czyli co 5 minut), wykona żądaną funkcję

Poza warunkami będzie spał przez 59 sekund sleep(59);(zakładając, że twoja funkcja jest szybka). Po śnie uruchomi się file_get_contents()ponownie.

Ważne rzeczy do zapamiętania:

  1. Stwórz sposób na przerwanie procesu (tj. Sprawdzenie wartości w DB)
  2. Stwórz sposób, aby zapobiec 2 procesom jednocześnie
  3. Na file_get_contents ustaw limit czasu dla nagłówka na 2 lub 3 sekundy, w przeciwnym razie serwer może mieć różne procesy czekające na nic
  4. Możesz użyć tej opcji, set_time_limit(90);aby uniemożliwić serwerowi przerwanie funkcji przed snem

To rozwiązanie nie jest dobre i może zostać zablokowane przez serwer. Za pomocą zewnętrznego crona możesz ustawić prostą funkcję, a serwer będzie zużywał na nim zasoby co 5 minut. Korzystając z tego rozwiązania, serwer będzie cały czas zużywał na nim zasoby.

Bruno Cantuaria
źródło
0

Odpowiedź @ johano poprawnie wyjaśnia, jak ustawić niestandardowy interwał dla zadania WP cron. Na drugie pytanie nie ma odpowiedzi, czyli jak uruchomić cron co minutę:

  1. W pliku wp-config.phpdodaj następujący kod:

    define('DISABLE_WP_CRON', true);
  2. Dodaj zadanie crona ( crontab -ena unix / linux):

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

Pierwsza część (krok 1) wyłączy zadanie wewnętrznego crona WordPress. Druga część (krok 2) będzie ręcznie uruchamiać zadanie cron WordPress co minutę.

Z odpowiedzią @ Johano (jak uruchomić zadanie co 5 minut) i moją (jak ręcznie uruchomić crona), powinieneś być w stanie osiągnąć swój cel.

Mikrofon
źródło