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?

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.


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

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.