Drush Scripting? A może Batch API?

8

Mamy witrynę internetową Ubercart, która codziennie obsługuje duże ilości zamówień, przetwarza je i wykonuje inne zadania, takie jak fakturowanie, routing dostaw i tworzenie przyszłych zamówień.

Niektóre z tych zadań są ciężkie i czasami powodują przekroczenie limitu czasu PHP. Czy istnieje lepszy sposób uruchamiania tych zadań, takich jak Drush lub Batch API?

Szybkość niekoniecznie jest priorytetem (chociaż jest ładna), ale chcemy uniknąć przekroczenia limitu czasu, co może czasami powodować problemy z prawidłowym rozliczaniem i planowaniem codziennych zamówień.

Czy skrypt Drush jest lepszą opcją, czy Batch API? Czy są jakieś samouczki, aby lepiej wykorzystać oba?

Kevin
źródło

Odpowiedzi:

13

Nie sugerowałbym używania wsadowego interfejsu API, po prostu dlatego, że operacje wsadowe zależą od przeglądarki; jeśli z jakiegokolwiek powodu przeglądarka ulegnie awarii lub utraci połączenie z serwerem, operacje wsadowe nie zostaną zakończone lub (gorzej) będą się zawieszać. W rzeczywistości, aby uniknąć przekroczenia limitu czasu PHP, operacje wsadowe powodują, że przeglądarka w odstępach czasu sprawdza ping strony wsadowej; tak się dzieje, ilekroć kod JavaScript jest zaangażowany, czy nie (w późniejszym przypadku Drupal używa metatagu odświeżania).

W takich przypadkach Drush jest prawdopodobnie lepszym wyborem; możesz utworzyć niestandardowy moduł, który implementuje określone polecenia Drush, lub po prostu dodać plik poleceń do katalogu, w którym Drush używa swoich poleceń.

kiamlaluno
źródło
2
Oprócz drusha możesz faktycznie użyć kolejki, aby uruchomić wiele przedmiotów jednocześnie.
Daniel Wehner,
2

Możesz także użyć niestandardowego skryptu CLI PHP. Oto prosty przykład dla 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
źródło
4
Problem polega na tym, że wymyślasz koło na nowo. Drush jest lepszym wyborem, ponieważ już to zrobi, a ramy już istnieją!
Chris Cohen,
1
Nie lubię instalować drush na wszystkich serwerach, na których chcę coś zrobić.
ya.teck
2
Czy jest powód dlaczego? jest tak samo intensywny jak instalacja jakiegokolwiek innego modułu.
Robiłem to wiele razy i myślę, że ta metoda jest trochę łatwiejsza.
ya.teck
1

Mam witrynę D6 Ubercart, która wymaga znacznego przetwarzania zaplecza dla „automatycznie generowanych produktów cyfrowych”. Obsługuję to poprzez:

  1. Zakup jednego z tych niestandardowych produktów cyfrowych powoduje zapisanie tabeli db dla „produktów, które należy skompilować”. W tym wpisie db znajduje się pole „status”.
  2. Skrypt BASH jest uruchamiany z poziomu Drupala, który działa w tle. Ten skrypt jest ponownie uruchamiany, co oznacza, że ​​jest świadom wywołania go podczas działania i dodaje nowe dzieło do każdego istniejącego dzieła, które ma zostać ukończone.
  3. Ten skrypt BASH zwiększa pole „status” w bazie danych Drupal podczas tworzenia niestandardowego produktu cyfrowego, a na koniec do użytkownika wysyłane jest powiadomienie e-mail z linkiem do pobrania gotowego produktu niestandardowego.

Jest to nieco podobne rozwiązanie do proponowanego przez Xio, z tym wyjątkiem, że nie używa on skryptu CLI PHP, ale skrypty BASH wywoływane przez PHP w Drupal, aby działały w tle. Te skrypty BASH uzyskują dostęp do bazy danych Drupal i zwiększają wartości statusu wszystkich produktów, które kompiluje i wysyła do klientów. Ponadto Drupal jest w stanie zobaczyć te wartości statusu i zgłosić się do klientów, którzy podczas „niestandardowego procesu tworzenia” dokonują zakupów.

Blake Senftner
źródło