Drush Scripting? ¿O API por lotes?

8

Tenemos un sitio web de Ubercart que maneja grandes volúmenes de pedidos diariamente, los procesa y ejecuta otras tareas como facturación, enrutamiento de entrega y creación de pedidos futuros.

Algunas de estas tareas son pesadas y, a veces, hacen que PHP agote el tiempo de espera. ¿Hay una mejor manera de ejecutar estas tareas como a través de Drush o Batch API?

La velocidad no es necesariamente una prioridad (aunque agradable), pero queremos evitar tiempos de espera, que a veces pueden causar problemas con la facturación correcta y la programación de pedidos diarios.

¿Es la secuencia de comandos Drush la mejor opción o la API de Batch? ¿Hay algún tutorial para hacer un mejor uso de ambos?

Kevin
fuente

Respuestas:

13

No sugeriría usar la API por lotes, simplemente por el hecho de que las operaciones por lotes dependen del navegador; si por alguna razón el navegador falla o pierde la conexión con el servidor, las operaciones por lotes no finalizarán o, lo que es peor, se suspenderán. De hecho, para evitar tiempos de espera de PHP, las operaciones por lotes hacen que el navegador haga ping a la página de lotes a intervalos; eso es lo que sucede, siempre que el código JavaScript esté involucrado o no (en el caso posterior, Drupal usa la metaetiqueta de actualización).

En estos casos, Drush es probablemente una mejor opción; puede crear un módulo personalizado que implemente comandos específicos de Drush, o simplemente agregar un archivo de comandos en el directorio que Drush usa para sus comandos.

kiamlaluno
fuente
2
Además de drush, en realidad también podría usar una cola para ejecutar varios elementos al mismo tiempo.
Daniel Wehner
2

También puede usar un script PHP CLI personalizado. Aquí hay un ejemplo simple para 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
fuente
44
El problema aquí es que estás reinventando la rueda. Drush es la mejor opción ya que ya hará este tipo de cosas y el marco ya está en su lugar
Chris Cohen
1
No me gusta instalar drush en todos los servidores donde quiero hacer algo.
ya.teck
2
¿Hay alguna razón por qué? es tan intensivo como instalar cualquier otro módulo.
Lo estaba haciendo muchas veces y creo que este método es un poco más fácil.
ya.teck
1

Tengo un sitio D6 Ubercart que requiere un procesamiento de fondo significativo para los 'productos digitales generados automáticamente'. Manejo esto a través de:

  1. La compra de uno de estos productos digitales personalizados genera una entrada en la tabla db para 'productos que deben compilarse'. En esa entrada db hay un campo 'estado'.
  2. Se inicia un script BASH desde Drupal que se ejecuta en segundo plano. Este script es 'reentrante', lo que significa que es consciente de que se invoca mientras se ejecuta y agrega el nuevo trabajo a cualquier trabajo existente que aún no se haya completado.
  3. Este script de BASH incrementa el campo 'estado' en la base de datos de Drupal a medida que se crea un producto digital personalizado, y finalmente se envía un aviso por correo electrónico al usuario con un enlace de descarga para su producto personalizado completo.

Esta es una solución algo similar a la propuesta por Xio, con la excepción de que no usa un script PHP CLI, sino scripts BASH invocados por PHP en Drupal para ejecutarse en segundo plano. Esas secuencias de comandos de BASH acceden a la base de datos de Drupal y avanzan los valores de "estado" de cualquier producto que está compilando y enviando a los clientes. Además, Drupal puede ver estos valores de estado e informar a los clientes donde en el 'proceso de creación personalizada' se encuentran sus compras en este momento.

Blake Senftner
fuente