Drush Scripting? O API batch?


8

Abbiamo un sito Web Ubercart che gestisce quotidianamente grandi volumi di ordini, li elabora ed esegue altre attività come la fatturazione, l'inoltro delle consegne e la creazione di ordini futuri.

Alcune di queste attività sono pesanti e talvolta causano il timeout di PHP. Esiste un modo migliore per eseguire queste attività come tramite Drush o Batch API?

La velocità non è necessariamente una priorità (anche se piacevole), ma vogliamo evitare i timeout, che a volte possono causare problemi con la fatturazione corretta e la pianificazione degli ordini giornalieri.

Drush script è l'opzione migliore o API Batch? Esistono tutorial per utilizzare meglio entrambi?

Risposte:


13

Non consiglierei di usare l'API batch, semplicemente per il fatto che le operazioni batch dipendono dal browser; se per qualsiasi motivo il browser si arresta in modo anomalo o perde la connessione con il server, le operazioni batch non verranno interrotte o (peggio) verranno sospese. In effetti, per evitare i timeout di PHP, le operazioni batch fanno sì che il browser esegua il ping della pagina batch a intervalli; questo è ciò che accade, ogni volta che è coinvolto il codice JavaScript o meno (nel caso successivo, Drupal utilizza il metatag di aggiornamento).

In questi casi, Drush è probabilmente una scelta migliore; puoi creare un modulo personalizzato che implementa specifici comandi Drush o semplicemente aggiungere un file di comando nella directory che Drush usa per i suoi comandi.


2
In aggiunta al drush potresti effettivamente usare una coda per far correre più elementi contemporaneamente.
Daniel Wehner,

2

Inoltre è possibile utilizzare lo script CLI PHP personalizzato. Ecco un semplice esempio per 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

4
Il problema qui è che stai reinventando la ruota. Drush è la scelta migliore poiché farà già questo tipo di cose e il framework è già in atto!
Chris Cohen,

1
Non mi piace installare drush su tutti i server in cui voglio fare qualcosa.
ya.teck

2
C'è un motivo per cui? è intensivo come l'installazione di qualsiasi altro modulo.

Lo stavo facendo molte volte e penso che questo metodo sia un po 'più semplice.
ya.teck

1

Ho un sito D6 Ubercart che richiede una significativa elaborazione back-end per "prodotti digitali generati automaticamente". Gestisco questo tramite:

  1. L'acquisto di uno di questi prodotti digitali personalizzati provoca una voce della tabella db per "prodotti che devono essere compilati". In quel db la voce è un campo 'status'.
  2. Uno script BASH viene avviato da Drupal che viene eseguito in background. Questo script è 'rientrante', nel senso che è consapevole di essere invocato durante l'esecuzione e aggiunge il nuovo lavoro a qualsiasi lavoro esistente ancora da completare.
  3. Questo script BASH incrementa il campo 'status' nel database Drupal quando viene creato un prodotto digitale personalizzato, e infine viene inviata all'utente una notifica e-mail con un collegamento per il download del prodotto personalizzato completo.

Questa è una soluzione in qualche modo simile a quella proposta da Xio, con l'eccezione che non utilizza uno script CLI PHP, ma gli script BASH invocati da PHP in Drupal per essere eseguiti in background. Questi script BASH accedono al database Drupal e avanzano i valori di "stato" di tutti i prodotti che sta compilando e inviando ai clienti. Inoltre, Drupal è in grado di vedere questi valori di stato e riferire ai clienti dove al momento si trovano i loro acquisti nel "processo di creazione personalizzata".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.