Drush Scripting? Oder Batch-API?

8

Wir haben eine Ubercart-Website, die täglich große Auftragsmengen bearbeitet, verarbeitet und andere Aufgaben wie Abrechnung, Lieferrouting und zukünftige Auftragserstellung ausführt.

Einige dieser Aufgaben sind schwer und führen manchmal zu einem Timeout von PHP. Gibt es eine bessere Möglichkeit, diese Aufgaben wie über die Drush- oder Batch-API auszuführen?

Geschwindigkeit ist nicht unbedingt eine Priorität (obwohl nett), aber wir möchten Zeitüberschreitungen vermeiden, die manchmal Probleme mit der korrekten Abrechnung und der Planung täglicher Bestellungen verursachen können.

Ist Drush-Skript die bessere Option oder Batch-API? Gibt es Tutorials, um beide besser zu nutzen?

Kevin
quelle

Antworten:

13

Ich würde nicht empfehlen, die Batch-API zu verwenden, nur weil Batch-Vorgänge vom Browser abhängen. Wenn der Browser aus irgendeinem Grund abstürzt oder die Verbindung zum Server verliert, werden die Batch-Vorgänge nicht beendet oder (schlimmer noch) hängen. Um PHP-Zeitüberschreitungen zu vermeiden, veranlassen die Stapeloperationen den Browser, die Stapelseite in Intervallen zu pingen. Dies ist der Fall, wenn JavaScript-Code beteiligt ist oder nicht (im späteren Fall verwendet Drupal das Aktualisierungs-Meta-Tag).

In diesen Fällen ist Drush wahrscheinlich die bessere Wahl. Sie können ein benutzerdefiniertes Modul erstellen, das bestimmte Drush-Befehle implementiert, oder einfach eine Befehlsdatei in dem Verzeichnis hinzufügen, das Drush für seine Befehle verwendet.

kiamlaluno
quelle
2
Zusätzlich zum Drush können Sie auch eine Warteschlange verwenden, um mehrere Elemente gleichzeitig auszuführen.
Daniel Wehner
2

Sie können auch ein benutzerdefiniertes PHP-CLI-Skript verwenden. Hier ist ein einfaches Beispiel für Drupal 7:

#!/usr/bin/php
<?php
echo "Ubercart tasks\n===================\n";

$_SERVER['HTTP_HOST']       = 'default';
$_SERVER['PHP_SELF']        = '/index.php';
$_SERVER['REMOTE_ADDR']     = '127.0.0.1';
$_SERVER['SERVER_SOFTWARE'] = NULL;
$_SERVER['REQUEST_METHOD']  = 'GET';
$_SERVER['QUERY_STRING']    = '';
$_SERVER['PHP_SELF']        = $_SERVER['REQUEST_URI'] = '/';
$_SERVER['HTTP_USER_AGENT'] = 'console';

define('DRUPAL_ROOT', getcwd());
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
//-------------------------------------------

// Place your code here
ya.teck
quelle
4
Das Problem hier ist, dass Sie das Rad neu erfinden. Drush ist die bessere Wahl, da dies bereits möglich ist und der Rahmen bereits vorhanden ist!
Chris Cohen
1
Ich mag es nicht, drush auf allen Servern zu installieren, auf denen ich etwas tun möchte.
ya.teck
2
Gibt es einen Grund warum? Es ist ungefähr so ​​intensiv wie die Installation eines anderen Moduls.
Ich habe es oft gemacht und ich denke, diese Methode ist etwas einfacher.
ya.teck
1

Ich habe eine D6-Ubercart-Site, die eine erhebliche Back-End-Verarbeitung für "automatisch generierte digitale Produkte" erfordert. Ich kümmere mich darum über:

  1. Der Kauf eines dieser benutzerdefinierten digitalen Produkte führt zu einem DB-Tabelleneintrag für "Produkte, die kompiliert werden müssen". In diesem Datenbankeintrag befindet sich ein 'Status'-Feld.
  2. Ein BASH-Skript wird in Drupal gestartet, das im Hintergrund ausgeführt wird. Dieses Skript ist "Wiedereinsteiger", dh es ist sich bewusst, dass es während der Ausführung aufgerufen wird, und fügt die neue Arbeit zu allen noch zu erledigenden Arbeiten hinzu.
  3. Dieses BASH-Skript erhöht das Feld "Status" in der Drupal-Datenbank, wenn ein benutzerdefiniertes digitales Produkt erstellt wird, und schließlich wird dem Benutzer eine E-Mail-Benachrichtigung mit einem Download-Link für das fertige benutzerdefinierte Produkt gesendet.

Dies ist eine etwas ähnliche Lösung wie die von Xio vorgeschlagene, mit der Ausnahme, dass hier kein PHP-CLI-Skript verwendet wird, sondern BASH-Skripte, die von PHP in Drupal aufgerufen werden, um im Hintergrund ausgeführt zu werden. Diese BASH-Skripte greifen auf die Drupal-Datenbank zu und erhöhen die Statuswerte aller Produkte, die kompiliert und an Kunden gesendet werden. Außerdem kann Drupal diese Statuswerte anzeigen und an die Kunden zurückmelden, bei denen sich ihre Einkäufe im "benutzerdefinierten Erstellungsprozess" gerade befinden.

Blake Senftner
quelle