Como o lote funciona em torno do tempo limite do PHP

9

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!

Torradeira
fonte
3
Esta é uma bonita maldição boa pergunta, obrigado :-)
Chapabu

Respostas:

5

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.

tenken
fonte
11
Você está dizendo que o lote é invocado a cada carregamento da página; ie Lote acorda para ver se há alguma tarefa (como o cron de poorman)? Isso era suspeito; no entanto, não entendo por que você enfatizou o custo computacional do processo. Não é o custo adicional apenas algumas comparações e qualquer trabalho que o Lote tenha na fila ou o Lote está fazendo algo especial como se chamar carregando uma página?
Torradeira
11
veja a resposta kiamlaluno abaixo. Uma página da barra de progresso do lote simplesmente é recarregada após X segundos. Se você carregar o Firebug ou o Chrome na guia Rede e executar um trabalho da API do Lote, observe os URLs e verá a mesma página chamada com diferentes desvios de itens e tamanhos de fragmentos. O custo de computação da inicialização de todo o drupal a cada solicitação de página é ALTO. A execução de uma importação sql Drush carrega o drupal apenas uma vez, por exemplo. Para grandes conjuntos de dados e problemas, a sobrecarga da API do lote se torna muito alta.
Dez15
3

A API de lote simplesmente registra _batch_shutdown()como função de desligamento com register_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.

kiamlaluno
fonte