it-swarm-eu.dev

Běh WP Cron na multisite správným způsobem

Mám WordPress Multisite s několika weby. Nastavil jsem DISABLE_WP_CRON na true v mém wp-config.php.

Pokud nastavíme cron úkol s wget nebo curl máme 30 sec pravidlo k provedení PHP skript. Je to tak malé posílat tuny e-mailových oznámení a dělat jiné věci (možná vzdálené SMTP server připojení je pomalé, možná je to opravdu obrovský svazek e-mailových oznámení z bbPress nebo cokoliv).

Možná můžeme něco takového použít?

php -q wp-cron.php

Ale je to jen spustit cron na jednom místě v Multisite (každý web má své vlastní cron úkoly v různých MySQL tabulek).

P. S. Na wpmudev.org forum Našel jsem podivné "řešení", které také používá Curl.

Další P. S. WP CLI má úžasné wp cron příkazy ale je to pouze povoleno spustit cron úlohy ručně (yep, můžeme použít --url attr). Například:

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

Myslím, že nejlepším způsobem je použít WP-CLI, ale musíte to udělat. Zde je ten, který by to měl udělat pro vás:

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

Pak byste měli přidat tento skript do crontab a spustit ho každou minutu, pokud chcete

12

Po přidání konstanty v souboru wp-config.php

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

WP-CLI

A za předpokladu, že máte config.yml setup správně, můžete vynechat příznak --path při volání cron run .


wp cron event run --due-now

[<hook>…] Jeden nebo více háčků ke spuštění.

[--due-now] Spusťte všechny háčky, které jsou právě teď.

[--all] Spusťte všechny háčky.


Chcete-li spustit všechny řádné úlohy cron v pořadí:

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;

Chcete-li, aby byly spuštěny souběžně (nejprve spuštění cronu specifického pro konkrétní lokalitu):

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;

Chcete spustit jednu možnost do spustitelného souboru

chmod +x run_all_wp_cron_events_due_now.sh

přidejte úkol crontab

crontab -e

a pravděpodobně provádějí každou minutu

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

Pokud chcete spustit příkaz custom from cron, budete možná muset zadat plné cesty pro wp-cli do práce.

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

PHP

Jediným důvodem, proč byste museli načíst WordPress zde je shromáždit URL z databáze, spíše než pomocí předem definovaného seznamu. Budeme pouze ping tyto adresy URL a my opravdu není jedno, co je odpověď.

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

A přidejte jeden hovor do custom-cron.php v crontab

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

Toto je moje řešení:

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

Říkáme tomu z crontab, doufáme, že to pomůže

0
Amon-Ra