it-swarm.com.de

Laufen WP Cron auf Multisite den richtigen Weg

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
18

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

12

Nachdem Sie die Konstante in wp-config.php hinzugefügt haben

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

WP-CLI

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

PHP

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
11
jgraup

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

0
Amon-Ra