A documentação do Drupal 7 apresenta a API do lote como:
Funções que permitem que o processamento de formulários se espalhe por várias solicitações de página, garantindo assim que o processamento não seja interrompido devido a um tempo limite do PHP ...
Entendi que isso significa que o Lote lida com os problemas relacionados ao tempo limite do desenvolvedor.
No entanto, outras postagens (por exemplo, como a API de lote funciona internamente? ) Implicam que é responsabilidade do desenvolvedor informar ao Lote quanto trabalho deve ser feito antes de esperar a chegada de outro usuário e que o Lote seja invocado novamente - evitando assim o tempo esgotado.
Se o último for verdadeiro, presumo que o Lote não garanta que o tempo limite dos trabalhos não seja atingido. O Lote oferece alguma garantia? Cabe ao desenvolvedor adivinhar quanto Batch pode processar antes de atingir o tempo limite?
Obrigado!
fonte
Respostas:
O lote simplesmente diz "Eu farei N várias coisas (no máximo) e depois atualizarei a página ... e farei mais".
Se você disser fazer 5 itens por bloco de tarefas que levam 5 segundos cada um, você ficaria bem com o valor padrão do tempo limite do php de 30 segundos.
Se você diz que faz 20 itens por bloco de tarefas que levam 5 segundos cada, sua carga de trabalho por solicitação é muito alta e provavelmente expirará.
Lembre-se de quando no PHP o ciclo de vida de uma página é
request in -> response out
. E que seu servidor da web mantém cada thread ativo por um período finito de tempo. Você precisa contornar esse tempo limite - o que a API do Lote ajuda a fazer.A execução de coisas como o Drush, do lado do servidor, usando módulos da comunidade como o Migrate, pode ajudá-lo a evitar completamente o tempo limite, se necessário.
EDITAR
Lembre-se também de que toda solicitação de página é uma inicialização drupal completa e a API do Lote começa de onde parou. Essa é uma das operações mais caras ao usar a API do Lote, recarregando drupal todos os N itens. É por isso que as pessoas têm trabalhado nas técnicas do servidor para criar nós, importar conteúdo etc. A API de lote é excelente para tarefas simples e repetitivas. Mas tende a desmoronar em conjuntos de dados complexos ou muito muito grandes.
fonte
A API de lote simplesmente registra
_batch_shutdown()
como função de desligamento comregister_shutdown_function()
. Essa função salva em uma tabela do banco de dados o estado atual do lote que está sendo executado.A API do lote não oferece nenhuma garantia de que a operação que você está executando não seja interrompida no meio. É por isso que as operações em lote normalmente executam operações simples, como ler uma linha do banco de dados ao salvar uma tabela e salvar uma linha do banco de dados em outra tabela.
fonte