Drush Scripting? Ou l'API batch?

8

Nous avons un site Web Ubercart qui gère quotidiennement de gros volumes de commandes, les traite et exécute d'autres tâches telles que la facturation, l'acheminement des livraisons et la création de commandes futures.

Certaines de ces tâches sont lourdes et entraînent parfois un dépassement de délai de PHP. Existe-t-il un meilleur moyen d'exécuter ces tâches, comme via Drush ou Batch API?

La vitesse n'est pas nécessairement une priorité (bien que agréable), mais nous voulons éviter les délais d'attente, ce qui peut parfois entraîner des problèmes de facturation correcte et de planification des commandes quotidiennes.

Le script Drush est-il la meilleure option ou l'API Batch? Existe-t-il des tutoriels pour mieux utiliser les deux?

Kevin
la source

Réponses:

13

Je ne suggérerais pas d'utiliser l'API batch, simplement parce que les opérations batch dépendent du navigateur; si, pour une raison quelconque, le navigateur se bloque ou s'il perd la connexion avec le serveur, les opérations par lots ne s'arrêtent pas ou (pire) elles se bloquent. En fait, pour éviter les délais d'expiration de PHP, les opérations par lots font que le navigateur envoie une requête ping à la page de lots à intervalles; c'est ce qui se produit, chaque fois que du code JavaScript est impliqué ou non (dans le dernier cas, Drupal utilise la balise meta refresh).

Dans ces cas, Drush est probablement un meilleur choix; vous pouvez créer un module personnalisé qui implémente des commandes Drush spécifiques, ou simplement ajouter un fichier de commandes dans le répertoire utilisé par Drush pour ses commandes.

kiamlaluno
la source
2
En plus de drush, vous pouvez également utiliser une file d'attente pour exécuter plusieurs éléments en même temps.
Daniel Wehner
2

Vous pouvez également utiliser un script CLI PHP personnalisé. Voici un exemple simple pour 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
la source
4
Le problème ici est que vous réinventez la roue. Drush est le meilleur choix car il fera déjà ce genre de chose et le cadre est déjà en place!
Chris Cohen
1
Je n'aime pas installer drush sur tous les serveurs où je veux faire quelque chose.
ya.teck
2
Y a-t-il une raison? c'est à peu près aussi intensif que d'installer n'importe quel autre module.
Je le faisais plusieurs fois et je pense que cette méthode est un peu plus facile.
ya.teck
1

J'ai un site D6 Ubercart qui nécessite un traitement back-end important pour les «produits numériques générés automatiquement». Je gère cela via:

  1. L'achat de l'un de ces produits numériques personnalisés entraîne une entrée de table db pour les «produits qui doivent être compilés». Dans cette entrée de base de données se trouve un champ «état».
  2. Un script BASH est démarré à partir de Drupal qui s'exécute en arrière-plan. Ce script est «rentrant», ce qui signifie qu'il est conscient d'être appelé lors de l'exécution et ajoute le nouveau travail à tout travail existant qui n'est pas encore terminé.
  3. Ce script BASH incrémente le champ «état» dans la base de données Drupal à mesure qu'un produit numérique personnalisé est créé, et enfin un avis par courrier électronique est envoyé à l'utilisateur avec un lien de téléchargement pour son produit personnalisé terminé.

Il s'agit d'une solution quelque peu similaire à celle proposée par Xio, à l'exception qu'elle n'utilise pas de script CLI PHP, mais des scripts BASH invoqués par PHP dans Drupal pour s'exécuter en arrière-plan. Ces scripts BASH accèdent à la base de données Drupal et font avancer les valeurs de «statut» de tous les produits qu'elle compile et envoie aux clients. De plus, Drupal est capable de voir ces valeurs de statut et de faire rapport aux clients où, dans le «processus de création personnalisé», leurs achats se trouvent actuellement.

Blake Senftner
la source