Drush Scripting? Або пакетний API?


8

У нас є веб-сайт Ubercart, який щодня обробляє великі обсяги замовлень, обробляє їх і виконує інші завдання, такі як виставлення рахунків, маршрутизація доставки та створення майбутніх замовлень.

Деякі з цих завдань важкі і іноді викликають тайм-аут PHP. Чи є кращий спосіб виконувати ці завдання, наприклад, через Drush або Batch API?

Швидкість не обов'язково є пріоритетною (хоча і приємною), але ми хочемо уникати тайм-аутів, які іноді можуть спричинити проблеми з правильним виставленням рахунків та плануванням щоденних замовлень.

Чи краще сценарій Drush - кращий варіант, або Batch API? Чи є підручники, щоб краще використовувати обидва?

Відповіді:


13

Я б не пропонував використовувати пакетний API, просто для того, що пакетні операції залежать від браузера; якщо з будь-якої причини браузер виходить з ладу, або він втрачає зв’язок із сервером, пакетні операції не припиняться, або (що ще гірше) вони будуть висіти. Насправді, щоб уникнути тайм-аутів PHP, пакетні операції змушують браузер переглядати сторінку партії з інтервалом; це те, що відбувається, коли кожен код JavaScript включений, чи ні (у подальшому випадку Drupal використовує метатег оновлення).

У цих випадках Друш, мабуть, кращий вибір; ви можете створити спеціальний модуль, який реалізує конкретні команди Drush, або просто додати командний файл у каталог, який Drush використовує для своїх команд.


2
На додаток до барабану ви також можете користуватися чергою, щоб одночасно запускати кілька предметів.
Даніель Венер

2

Також ви можете використовувати користувацький сценарій PHP CLI. Ось простий приклад для 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
Проблема тут полягає в тому, що ви винаходите колесо. Друш - кращий вибір, оскільки він вже буде робити подібні речі, і рамки вже створені!
Кріс Коен

1
Мені не подобається встановлювати барабан на всіх серверах, де я хочу щось робити.
ya.teck

2
Чи є причина, чому? це приблизно так само інтенсивно, як встановлення будь-якого іншого модуля.

Я робив це багато разів і думаю, що цей метод трохи простіше.
ya.teck

1

У мене є сайт D6 Ubercart, який потребує суттєвої обробки даних для "автоматично створених цифрових продуктів". Я вирішую це за допомогою:

  1. Придбання однієї з цих нестандартних цифрових продуктів спричиняє запис таблиці db для "продуктів, які потрібно скласти". У цьому db записі є поле "статус".
  2. Сценарій BASH запускається з Drupal, який працює у фоновому режимі. Цей сценарій є "повторним учасником", тобто він знає, що його викликають під час запуску, і додає нову роботу до будь-якої існуючої роботи, яка ще повинна бути завершена.
  3. Цей сценарій BASH збільшує поле "статус" у базі даних Drupal як створений на замовлення цифровий продукт, і, нарешті, повідомлення електронною поштою надсилається користувачеві із посиланням для завантаження завершеного користувальницького продукту.

Це дещо схоже рішення з рішенням, запропонованим Xio, за винятком того, що для цього не використовується сценарій PHP CLI, а сценарії BASH, які викликає PHP в Drupal, для запуску у фоновому режимі. Ці сценарії BASH отримують доступ до бази даних Drupal та висувають значення "статусу" будь-яких продуктів, які він збирає та надсилає клієнтам. Крім того, Drupal має змогу побачити ці значення статусу та звітувати перед зберігачами, де в процесі «користувацького створення» на даний момент відбувається їх покупка.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.