Drush Scripting? Ou API de lote?

8

Temos um site Ubercart que lida com grandes volumes de pedidos diariamente, os processa e executa outras tarefas como cobrança, roteamento de entrega e criação futura de pedidos.

Algumas dessas tarefas são pesadas e, às vezes, causam o tempo limite do PHP. Existe uma maneira melhor de executar essas tarefas como através da API Drush ou Batch?

A velocidade não é necessariamente uma prioridade (embora agradável), mas queremos evitar tempos limite, que às vezes podem causar problemas no faturamento corretamente e no agendamento de pedidos diários.

O script Drush é a melhor opção ou a API do Lote? Existem tutoriais para fazer melhor uso de ambos?

Kevin
fonte

Respostas:

13

Eu não sugeriria usar a API em lote, simplesmente pelo fato de que as operações em lote dependem do navegador; se por algum motivo o navegador travar ou perder a conexão com o servidor, as operações em lote não serão encerradas ou, pior ainda, serão interrompidas. De fato, para evitar o tempo limite do PHP, as operações em lote fazem o navegador executar ping na página em lotes a intervalos; é isso que acontece, sempre que o código JavaScript está envolvido ou não (no caso posterior, o Drupal usa a metatag de atualização).

Nesses casos, Drush é provavelmente uma escolha melhor; você pode criar um módulo personalizado que implementa comandos Drush específicos ou simplesmente adicionar um arquivo de comando no diretório que o Drush usa para seus comandos.

kiamlaluno
fonte
2
Além do drush, você também pode usar uma fila para executar vários itens ao mesmo tempo.
Daniel Wehner
2

Além disso, você pode usar o script CLI PHP personalizado. Aqui está um exemplo simples para o 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
fonte
4
A questão aqui é que você está reinventando a roda. Drush é a melhor escolha, uma vez que já fará esse tipo de coisa e a estrutura já está em vigor!
Chris Cohen
11
Não gosto de instalar o drush em todos os servidores em que quero fazer alguma coisa.
usar o seguinte comando
2
Existe uma razão para isso? é tão intensivo quanto instalar qualquer outro módulo.
Eu estava fazendo isso várias vezes e acho esse método um pouco mais fácil.
usar o seguinte comando
1

Eu tenho um site D6 Ubercart que requer processamento de back-end significativo para 'produtos digitais gerados automaticamente'. Eu trato disso via:

  1. A compra de um desses produtos digitais personalizados causa uma entrada na tabela db para 'produtos que precisam ser compilados'. Na entrada db, existe um campo 'status'.
  2. Um script BASH é iniciado no Drupal que é executado em segundo plano. Este script é 'reentrante', o que significa que está ciente de ser chamado durante a execução e adiciona o novo trabalho a qualquer trabalho existente ainda a ser concluído.
  3. Esse script BASH incrementa o campo 'status' no banco de dados Drupal à medida que um produto digital personalizado é criado e, finalmente, um aviso por email é enviado ao usuário com um link de download para o produto personalizado concluído.

Essa é uma solução semelhante à proposta pelo Xio, com a exceção de que ele não usa um script CLI do PHP, mas os scripts BASH invocados pelo PHP no Drupal para serem executados em segundo plano. Esses scripts BASH acessam o banco de dados Drupal e avançam os valores de 'status' de qualquer produto que ele está compilando e enviando aos clientes. Além disso, o Drupal pode ver esses valores de status e reportar aos clientes onde, no 'processo de criação personalizado', suas compras estão no momento.

Blake Senftner
fonte