Ich habe WordPress Multisite mit mehreren Websites. Ich habe DISABLE_WP_CRON
in meinem wp-config.php
auf true
gesetzt.
Wenn wir eine Cron-Task mit wget oder curl einrichten, haben wir eine 30-Sekunden-Regel, um das Skript PHP auszuführen. Es ist so klein, Unmengen von E-Mail-Benachrichtigungen zu senden und andere Aufgaben zu erledigen (möglicherweise ist die SMTP-Remoteserververbindung langsam, möglicherweise sind es wirklich viele E-Mail-Benachrichtigungen von bbPress oder so).
Vielleicht können wir so etwas verwenden?
php -q wp-cron.php
Es wird jedoch in Multisite nur cron für eine Site ausgeführt (jede Site hat ihre eigenen cron-Tasks in verschiedenen MySQL-Tabellen).
P. S. Auf wpmudev.org Forum fand ich seltsame "Lösung", die auch Curl verwenden.
Ein anderes P. S. WP CLI hat großartige wp cron
-Befehle aber es erlaubt nur das manuelle Ausführen von Cron-Tasks (yep, wir können --url
attr verwenden). Zum Beispiel:
wp cron event list --url=multisite.com
wp cron event list --url=subdomain.multisite.com
Ich denke, der beste Weg ist, WP-CLI zu verwenden, aber Sie müssten ein Bash-Skript schreiben, um dies zu tun. 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 dieses Skript dann zu crontab hinzufügen und es möglicherweise jede Minute ausführen, wenn Sie möchten
Nachdem Sie die Konstante in wp-config.php
hinzugefügt haben
defined('DISABLE_WP_CRON') or define('DISABLE_WP_CRON', true);
Und wenn Sie Ihren config.yml
richtig eingerichtet haben, können Sie das --path
-Flag beim Aufrufen von cron run
weglassen.
wp cron event run --due-now
[<hook>…]
Ein oder mehrere auszuführende Hooks.
[--due-now]
Führe jetzt alle fälligen Hooks aus.
[--all]
Führe alle Hooks aus.
Um alle fälligen Cron-Aufgaben auszuführen in der Reihenfolge:
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 (zuerst das nicht standortspezifische Cron ausführen):
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 möchten eine der beiden 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
Der einzige Grund, warum Sie WordPress hier laden müssten, ist das Sammeln der URLs aus der Datenbank, anstatt eine vordefinierte Liste zu verwenden. Wir werden nur diese URLs pingen und es ist uns egal, wie die Antwort lautet.
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 );
}
Fügen Sie Ihrem custom-cron.php
in einer Crontab einen einzelnen Anruf hinzu
* * * * * wget -q -O - http://your-site.com/custom-cron.php?doing_wp_cron
Das ist meine Lösung:
global $multisite_hosts;
$multisite_hosts = Array('xxxx.dev.xxx.oondeo.es','x2.dev.xxx.oondeo.es','x3.dev.xxx.oondeo.es');
function run_cron(){
global $multisite_hosts;
$Host=array_pop($multisite_hosts);
if (!$Host)
return;
register_shutdown_function('shutdown');
if (!isset($_SERVER['HTTP_Host'])) {
$_SERVER['HTTP_Host'] = $Host; // replace with primary Host
}
require './wp-cron.php';
}
function shutdown()
{
run_cron();
}
run_cron();
Wir nennen das crontab, hoffe es hilft