Running WP Cron auf Multi-Site den richtigen Weg

Ich habe WordPress Multisite mit mehreren Seiten. Ich habe DISABLE_WP_CRON in meiner wp-config.php auf true wp-config.php .

Wenn wir Cron-Task mit wget oder curl einrichten, haben wir eine 30-Sekunden-Regel, um PHP-Skript auszuführen. Es ist so klein, um Tonnen von E-Mail-Benachrichtigungen zu senden und andere Sachen (vielleicht remote SMTP-Server-Verbindung ist langsam, vielleicht ist es wirklich eine Menge E-Mail-Benachrichtigungen von bbPress oder irgendetwas).

Vielleicht können wir so etwas verwenden?

 php -q wp-cron.php 

Aber es wird nur cron auf einer Seite in Multisite ausgeführt (jede Seite hat ihre eigenen Cron-Aufgaben in verschiedenen MySQL-Tabellen).

PS Auf wpmudev.org Forum fand ich seltsame “Lösung”, die auch Curl verwenden.

Eine andere PS WP CLI hat tolle wp cron Befehle , erlaubt aber nur das manuelle Ausführen von cron Aufgaben (yep, wir können --url attr verwenden). Beispielsweise:

 wp cron event list --url=multisite.com wp cron event list --url=subdomain.multisite.com 

Solutions Collecting From Web of "Running WP Cron auf Multi-Site den richtigen Weg"

Ich denke, der beste Weg ist, WP-CLI zu verwenden, aber Sie müssten dafür ein Bash-Skript schreiben. Hier ist eine, die es für Sie tun sollte:

 WP_PATH="/path/to/wp" for SITE_URL in = $(wp site list --fields=domain,path,archived,deleted --format=csv --path="$WP_PATH" | grep ",0,0$" | awk -F ',' '{print $1 $2}') do for EVENT_HOOK in $(wp cron event list --format=csv --fields=hook,next_run_relative --url="$SITE_URL" --path="$WP_PATH" | grep \"now\"$ | awk -F ',' '{print $1}') do wp cron event run "$EVENT_HOOK" --url="$SITE_URL" --path="$WP_PATH" done done 

Sie müssten dann dieses Skript zu crontab hinzufügen und es vielleicht jede Minute ausführen, wenn Sie möchten

Nachdem Sie die Konstante in wp-config.php

 defined('DISABLE_WP_CRON') or define('DISABLE_WP_CRON', true); 

WP-CLI

Und vorausgesetzt, Sie haben Ihr config.yml Setup richtig eingerichtet, können Sie das Flag --path beim Aufruf von cron run --path .


 wp cron event run --due-now 

[…] Ein oder mehrere Hooks zum Ausführen.

[--due-now] alle jetzt fälligen Haken aus.

[--all] alle Haken aus.


So führen Sie alle fälligen Cron-Aufgaben nacheinander aus :

function run_crons_due_now_in_order { for SITE_URL in $(wp site list --fields=url --format=csv | tail -n +2 | sort); do wp cron event run --due-now --url="$SITE_URL" && echo -e "\t+ Finished crons for $SITE_URL"; done; echo "Done"; }; run_crons_due_now_in_order;

Wenn Sie möchten, dass sie gleichzeitig ausgeführt werden (führen Sie zuerst den nicht standortspezifischen Cron aus):

function run_all_crons_due_now { for SITE_URL in $(wp site list --fields=url --format=csv | tail -n +2 | sort); do wp cron event run --due-now --url="$SITE_URL" && echo -e "\t+ Finished crons for $SITE_URL" & done; wait $(jobs -p); echo "Done"; }; run_all_crons_due_now;

Sie würden beide Optionen in eine ausführbare Datei einfügen

 chmod +x run_all_wp_cron_events_due_now.sh 

Fügen Sie eine Crontab-Aufgabe hinzu

 crontab -e 

und wahrscheinlich jede Minute ausführen

 * * * * * run_all_wp_cron_events_due_now.sh > /dev/null 

Wenn Sie einen benutzerdefinierten Befehl von cron ausführen möchten, müssen Sie möglicherweise die vollständigen Pfade angeben, damit wp-cli funktioniert.

 * * * * * cd /home/username/public_html; /usr/local/bin/php /home/username/wp-cli.phar your-custom-cron-commands run >/dev/null 2>&1 

PHP

Der einzige Grund, warum Sie WordPress hier laden müssen, besteht darin, die URLs aus der database zu sammeln, anstatt eine vordefinierte Liste zu verwenden. Wir werden nur diese URLs pingen und es interessiert uns nicht wirklich, was die Antwort ist.

custom-cron.php

 < ?php // Load WP require_once( dirname( __FILE__ ) . '/wp-load.php' ); // Check Version global $wp_version; $gt_4_6 = version_compare( $wp_version, '4.6.0', '>=' ); // Get Blogs $args = array( 'archived' => 0, 'deleted' => 0, 'public' => 1 ); $blogs = $gt_4_6 ? get_sites( $args ) : @wp_get_sites( $args ); // >= 4.6 // Run Cron on each blog echo "Running Crons: " . PHP_EOL; $agent = 'WordPress/' . $wp_version . '; ' . home_url(); $time = time(); foreach ( $blogs as $blog ) { $domain = $gt_4_6 ? $blog->domain : $blog['domain']; $path = $gt_4_6 ? $blog->path : $blog['path']; $command = "http://" . $domain . ( $path ? $path : '/' ) . 'wp-cron.php?doing_wp_cron=' . $time . '&ver=' . $wp_version; $ch = curl_init( $command ); $rc = curl_setopt( $ch, CURLOPT_RETURNTRANSFER, false ); $rc = curl_exec( $ch ); curl_close( $ch ); print_r( $rc ); print_r( "\t✔ " . $command . PHP_EOL ); } 

custom-cron.php Ihrer custom-cron.php in einer crontab einen einzelnen Aufruf hinzu

 * * * * * wget -q -O - http://your-site.com/custom-cron.php?doing_wp_cron 

Ich denke, Sie müssen uns sagen, was Sie mit “run wp-cron.php den richtigen Weg” in erster Linie meinen. Laut WordPress macht es keinen Sinn, dass du wp-cron deaktivierst und trotzdem ausführen willst … Aus der Linux-Perspektive wäre wget-ing oder / bin / php-ing wp-cron.php korrekt, aber Es scheint, dass Ihr bestimmter Host die Anzahl der PHP-Aufrufe aus Sicherheitsgründen einschränkt? – Dieser Teil ist nicht ganz klar aus Ihrer Beschreibung.

Eine andere Frage: Wie viele E-Mails sind “eine Tonne”? Es gibt gute Gründe, warum Sie nicht versuchen sollten, zu viele E-Mails so schnell zu versenden.

Sie müssen Ihre Ziele möglicherweise überdenken.

(Ich würde kommentieren, anstatt zu antworten, aber ich habe nicht genug Reputation auf wpstack.)