Executando verificação de segurança...
1
Wata
2 min de leitura ·

[Dúvida] Como posso gerar um pdf mais rápido usando php?

Problema: Estou trabalhando em uma aplicação Laravel que utiliza o MPDF para gerar relatórios em PDF. O banco de dados MySQL contém atualmente 9875 registros, e o objetivo é gerar um PDF com esses dados. Embora eu consiga gerar o PDF, o processo está extremamente lento, o que afeta a experiência do usuário.

Desafios: A principal dificuldade que estou enfrentando é melhorar o desempenho na hora de gerar o PDF. O tempo de execução aumenta significativamente à medida que o número de registros cresce, e com a tendência de o banco de dados crescer ainda mais no futuro, a situação pode piorar.

O que já fiz:
Utilizei o MPDF para converter o HTML em PDF com sucesso, mas o processo se torna ineficiente quando há muitos registros para processar.
Tentei algumas abordagens básicas para melhorar a performance, mas ainda não obtive o resultado esperado.
Objetivo: Gostaria de saber se alguém tem alguma sugestão ou estratégia para otimizar a geração de PDFs em uma situação como essa. Busco formas de reduzir o tempo de processamento, principalmente considerando que o banco de dados tende a crescer ao longo do tempo, aumentando a quantidade de registros a serem processados.

Possíveis estratégias que estou considerando:

Paginação dos dados (processar em lotes pequenos ao invés de carregar todos os registros de uma vez).
Utilização de cache ou geração em segundo plano.
Qualquer outra tática de otimização, seja para a consulta SQL, para a geração do HTML ou para o processo de renderização do PDF no MPDF.

Carregando publicação patrocinada...
1

Primeiro passo é você tentar fazer um profiling do seu codigo, ver em quais pontos está demorando.

Pode fazer usando alguma ferramenta de profiling, ou simplesmente marcando o tempo de execução em cada "passo" do seu código.

Veja se você está fazendo muitas queries ao banco, e se é possível unificar algumas dessas queries.

Quando estamos desenvolvendo não nos importamos com queries "demoradas" de 50ms. só que em produção as vezes essas queries se repetem dezenas de vezes, e ja viram alguns segundos.

As vezes o gargalo não tem nada a ver com a geração de PDF em si, mas sim com as suas queries, ou algum pedaço do código que está mal otimizado.

1

Pode ser que seja algum problema na consulta, verifique os custos das consultas.

Mas de qualquer forma, por que você não faz isso em um processo a parte usando filas ou estratégia similar? Depois de gerados os arquivos, você notifica o usuário ou manda por e-mail.

Fazer isso diretamente na requisição do usuário é loucura, vai acabar com o desempenho do sistema.

1

Tive um problema semelhante, mas com geração de xlsx.. A forma que resolvi foi passar o processamento para um Lambda Function da AWS, funcionou super bem.

1
1

Antes de poder te ajudar nos conte mais sobre como está estruturado o código, quanto tempo está demorando para retornar os dados, tratá-los, gerar somente o PDF, ...

Nos forneça mais informações.

1

Processe a geração de relatórios em segundo plano com queue jobs do Laravel, funciona super bem e não é difícil de programar.

Em questão de banco, eu prefiro PostgreSQL, é mais rápido, lida melhor com quantidades absurdas de registros e super confiável. Trabalho com suporte de um erp desktop que utiliza e pode atestar que é o melhor banco relacional open-source. Antes que me cancelem aqui (banco é um assunto com muitos fanboys), MySQL é largamente utilizado, até mesmo em grandes projetos, já utilizei muito, mas hoje sempre opto pelo Postgres. Somente essa consideração em relação ao banco, pois, querendo ou não, ele interfere no tempo.

Jogue o relatório para uma queue job e depois notifique o usuário para baixar.