it-swarm-eu.dev

Drush Scripting? Nebo Batch API?

Máme web Ubercart, který denně zpracovává velké množství objednávek, zpracovává je a spouští další úkoly, jako je fakturace, směrování dodávek a vytváření budoucích objednávek.

Některé z těchto úkolů jsou těžké a někdy způsobují vypršení časového limitu PHP). Existuje lepší způsob, jak tyto úkoly spustit, například pomocí rozhraní Drush nebo Batch API?

Rychlost není nutně prioritou (i když pěknou), ale chceme se vyhnout časovým limitům, které mohou někdy způsobit problémy se správným účtováním a naplánováním denních objednávek.

Je skript Drush lepší volbou nebo Batch API? Existují nějaké návody, jak lépe využít oba?

8
Kevin

Nenavrhoval bych používat dávkové API, jednoduše proto, že dávkové operace závisí na prohlížeči; pokud z nějakého důvodu dojde k selhání prohlížeče nebo ke ztrátě spojení se serverem, dávkové operace nebudou ukončeny, nebo (horší) budou viset. Ve skutečnosti, aby se předešlo PHP timeouts), dávkové operace způsobí, že prohlížeč ping na dávkové stránce v intervalech; to je to, co se stane, kdykoli je zapojen kód JavaScript, nebo ne (v pozdějším případě, Drupal používá metaznačku aktualizace).

V těchto případech je Drush pravděpodobně lepší volbou; můžete vytvořit vlastní modul, který implementuje konkrétní příkazy Drush, nebo jednoduše přidat soubor příkazů do adresáře, který Drush používá pro své příkazy.

13
kiamlaluno

Můžete také použít vlastní skript CLI PHP CLI. Zde je jednoduchý příklad pro 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
2
ya.teck

Mám web D6 Ubercart, který vyžaduje výrazné zpracování back-end pro 'automaticky generované digitální produkty'. Zvládnu to prostřednictvím:

  1. Nákup jednoho z těchto vlastních digitálních produktů způsobí záznam tabulky db pro „produkty, které je třeba kompilovat“. V této položce db je pole „status“.
  2. Skript BASH se spouští z uvnitř Drupal), který běží na pozadí. Tento skript je 're-entrant', což znamená, že je si vědom, že je spuštěn při běhu a přidává novou práci k jakékoli existující práci ještě musí být dokončena.
  3. Tento skript BASH zvětšuje pole „status“ v databázi Drupal = databáze jako vlastní digitální produkt je vytvořen) a konečně je uživateli zasláno e-mailové oznámení s odkazem ke stažení pro jeho hotový vlastní produkt.

Toto je poněkud podobné řešení, jaké navrhuje Xio, s tou výjimkou, že nepoužívá skript CLI PHP CLI, ale BASH skripty vyvolané PHP) na pozadí Drupal), který se spouští na pozadí. Tyto skripty BASH přistupují k databázi Drupal databáze a zvyšují hodnoty stavu všech produktů, které kompiluje a odesílá zákazníkům) Navíc, Drupal je schopen vidět tyto hodnoty stavu a podat zprávu zpět zákazníkům, kde v procesu „vlastního vytváření“ jejich nákupy probíhají v tuto chvíli.

1
Blake Senftner