Сценарий Drush? Или Пакетный API?


У нас есть веб-сайт Ubercart, который ежедневно обрабатывает большие объемы заказов, обрабатывает их и выполняет другие задачи, такие как выставление счетов, маршрутизация доставки и создание будущих заказов.

Некоторые из этих задач являются тяжелыми и иногда приводят к тайм-ауту PHP. Есть ли лучший способ выполнить эти задачи, например, через Drush или пакетный API?

Скорость не обязательно является приоритетом (хотя и приятным), но мы хотим избежать тайм-аутов, которые иногда могут вызвать проблемы с правильным выставлением счетов и планирование ежедневных заказов.

Является ли сценарий Drush лучшим вариантом или пакетным API? Есть ли какие-либо учебные пособия, чтобы лучше использовать и то, и другое?

Author: kiamlaluno, 2011-04-19

3 answers

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

В этих случаях Drush, вероятно, является лучшим выбором; вы можете создать пользовательский модуль, реализующий конкретные команды Drush, или просто добавить командный файл в каталог, который Drush использует для своих команд.

 13
Author: kiamlaluno, 2011-08-10 12:20:28

Также вы можете использовать пользовательский скрипт командной строки PHP. Вот простой пример для 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
Author: ya.teck, 2011-04-19 16:14:28

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

  1. Покупка одного из этих пользовательских цифровых продуктов вызывает запись в таблице бд для "продуктов, которые необходимо скомпилировать". В этой записи бд есть поле "статус".
  2. Скрипт BASH запускается из Drupal, который выполняется в фоновом режиме. Этот скрипт является "повторным участником", что означает, что он знает о вызове во время выполнения и добавляет новую работу в любая существующая работа еще не завершена.
  3. Этот скрипт BASH увеличивает поле "статус" в базе данных Drupal по мере создания пользовательского цифрового продукта, и, наконец, пользователю отправляется уведомление по электронной почте со ссылкой для загрузки их завершенного пользовательского продукта.

Это несколько аналогичное решение, предложенное Xio, за исключением того, что в нем не используется скрипт командной строки PHP, а сценарии BASH, вызываемые PHP в Drupal для запуска в фоновом режиме. Эти сценарии BASH получите доступ к базе данных Drupal и повысьте значения "статуса" любых продуктов, которые он собирает и отправляет клиентам. Кроме того, Drupal может видеть эти значения статуса и сообщать клиентам, где в "процессе создания на заказ" в данный момент находятся их покупки.

 1
Author: Blake Senftner, 2011-04-21 16:15:17