PHP - Tiempo excesivo en creación de PDF con html2pdf

 
Vista:
Imágen de perfil de Kathyu
Val: 1.803
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Tiempo excesivo en creación de PDF con html2pdf

Publicado por Kathyu (524 intervenciones) el 10/07/2019 19:57:12
Saludos.

Desde hace un tiempo vengo trabajando con html2pdf para la generación de los PDF's y puedo decir que trabaja muy bien, el problema que tengo ahorita es con archivos de varias paginas y varios registros desde la DB, les explico.

Si yo genero el PDF de un ingreso o de un reporte pequeño trabaja normal, pero si por ejemplo quiero sacar las compras que se hicieron en el mes de junio, y que estas vengan por factura (en cada linea una factura con sus montos y la informacion que yo quiera) el servidor se tarda demasiado en generar los PDF's (si es que lo genera).

Al inicio daba error de Fatal error: Maximum execution time of 30 seconds exceeded in "spipu\html2pdf\src\Parsing\Html.php" on line ### y al incrementar en apache el execution time dejó de aparecer el error pero se tarda como 5 minutos para generar un reporte de 9 paginas (el de las compras de junio, que llegan como a 100,000.00 USD con muchas lineas o facturas compradas durante el mes)

Ahora bien, si quito la función de generar el PDF, y solo imprimo el html de la tabla resultante del reporte, toda la informacion tarda LITERAL, menos de dos (2) segundos en todo, lo que significa que no es optimización de la query si no problema propio de generar el PDF.

Tienen alguna idea de como puedo corregir este error?? (yo ya estoy en busca de una solución tambien)

En extremo, tienen alguna otra librería similar para PHP que tome un HTML y lo pase a PDF?? yo he visto FPDF pero lo siento complicado, estar pasando coordenadas y todo eso, máxime cuando html2pdf solo toma un html y lo convierte en PDF.

Estaré al pendiente por si quieren mas info o tienen algún consejo !!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Mauro
Val: 1.667
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Tiempo excesivo en creación de PDF con html2pdf

Publicado por Mauro (467 intervenciones) el 10/07/2019 20:01:40
Dudo que puedas corregir el error (Tendrías que meterle seguramente más hardware...). Lo que yo haría sería separar la generación del pdf del proceso que responde a un request...

Por ejemplo, si dejás el pedido de generación del pdf en una cola y otro proceso background lo genera y después avisa al cliente (enviándole un mail por ejemplo), todo puede andar mejor (Incluso podés hacer la generación del pdf en otro server dedicado especialmente a eso)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kathyu
Val: 1.803
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Tiempo excesivo en creación de PDF con html2pdf

Publicado por Kathyu (524 intervenciones) el 10/07/2019 22:17:37
Si con lo de meterle mas al HW se refiere al servidor, pues el servidor que tengo es robusto, o es al cliente en si?? en cualquier caso no puedo con eso.

Con lo del request ya mas o menos había pensado en dividir el proceso, incluso ya lo intente hoy pero no tuve éxito.

por ejemplo para generar un PDF sigo esta linea


Archivo printer.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
    require '../resources/vendor/autoload.php'; //Cargo la librería
    use Spipu\Html2Pdf\Html2Pdf; //Cargo la librería
 
    // Compras Mes
    if (isset($_POST['form-comprasMes'])) { // Evaluó el formulario desde donde se ha mandado la peticion
    	ob_start();
        require_once 'comprasMes.php'; //Cargo el archivo HTML a convertit
	$html = ob_get_clean();
 
	    $html2pdf = new Html2Pdf();
	    $html2pdf->writeHTML($html);
	    $html2pdf->output('Compras del mes de '.$mes.'.pdf');
    }

Pero como tal, la petición de todas las compras de un mes pasa por el archivo printer, y es ahi donde creo se genera el cuello de botella, y los de html2pdf realmente no tienen solucion a este problema. Ahora si en ves de pasar al archivo printer.php yo envío el formulario directo al archivo comprasMes.php pues se genera en menos de 2 segundos.

Lo que se me ocurrió es tratar de generar el PDF desde el comprasMes.php pero me da error de encabezados y un montón de cosas mas, aun halando la librería y todo


Por el momento tambien voy a probar con mPDF que según leo, si tiene mas soporte para archivos grandes y esta hecho a base de TCPDF y html2pdf

Igual si alguien tiene el mismo escenario sin los tiempos excesivos, me puede ayudar
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mauro
Val: 1.667
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Tiempo excesivo en creación de PDF con html2pdf

Publicado por Mauro (467 intervenciones) el 11/07/2019 16:17:04
Mi recomendación es que uses algún sistema para procesar en paralelo. Cada vez que tenés que generar un pdf guardás el job en una cola y por otro lado tenés una tarea programada que levanta de esa cola y procesa.

Yo hice varias cosas de ese estilo así y funcionan muy bien
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kathyu
Val: 1.803
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Tiempo excesivo en creación de PDF con html2pdf

Publicado por Kathyu (524 intervenciones) el 11/07/2019 16:27:32
Puesi, el detalle es que no me da recursos de como hacerlo links de que seguir o ejemplos y esta difícil para alguien que no sabe con exactitud de que habla jeje

Por otro lado creo que ya lo solvente (aunque no descargo hacerlo en paralelo como ya hemos hablado mauro) con mPDF, realmente es muy bueno y robusto, no solo hace el PDF rápido de un mes si no que ya lo probé con 2 meses y aun así se genera rápido.

Tiene algunas contras mas que todo con los estilos pero ayer hice que el reporte quedara tal cual html2pdf y realmente me parece una muy buena opción
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mauro
Val: 1.667
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Tiempo excesivo en creación de PDF con html2pdf

Publicado por Mauro (467 intervenciones) el 11/07/2019 21:52:40
Ok... el tema de las referencias es algo complicado... no es instalar una librería si no más bien un tema de arquitectura...

Intentaré explicarme mejor:

Lo que se necesita es:

1. Tener un lugar donde almacenar los trabajos en cola (Puede ser una tabla en una BD relacional, un archivo de texto o cualquier otro lado al que puedan acceder dos procesos separados)
2. Un script que inicie la acción (Este será probablemente la respuesta a algún formulario HTML donde el usuario oprima un botón tipo "Generar PDF")
2. a. Este script lo que hará es generar un nuevo trabajo (Un registro en la tabla de trabajos por ejemplo), especificando todos los datos necesarios para generar dicho PDF y el destinatario al que deberá dársele aviso cuando esté lista la generación
2. b. Al finalizar este script emitirá un mensaje diciendo algo como "Su PDF está en proceso, en cuanto esté listo recibirá un email con el link de descarga"
3. Un proceso separado que:
3. a. Busque un trabajo pendiente en la cola
3. b. Lo quite de ella
3. c. Genere el pdf
3. d. Envíe un email al destinatario con un link para descargar el archivo generado
4. Una tarea programada que dispare el proceso de generación de pdfs cada, por ejemplo, 5 minutos
5. Un script que reciba el nombre del archivo pdf a descargar y lo ofrezca al visitante.

Espero haber sido más claro, cualquier duda me puedes consultar.

Algo que puede servir para aclarar es el patrón Command (En eso está basada esta idea).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip
Val: 2.949
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Tiempo excesivo en creación de PDF con html2pdf

Publicado por kip (876 intervenciones) el 11/07/2019 16:31:52
Hola, te recomiendo el uso de https://wkhtmltopdf.org/, este usa webkit como motor para renderizar el HTML.

Puedes instalar los binarios con composer, dependiendo de la arquitectura de tu servidor:

https://packagist.org/packages/h4cc/wkhtmltopdf-amd64
https://packagist.org/packages/h4cc/wkhtmltopdf-i386

Tambien puedes hacerlo de manera tradicional desde aqui https://wkhtmltopdf.org/downloads.html

Una vez tengas el binario, podrás usar algun wrapper como https://github.com/mikehaertl/phpwkhtmltopdf o https://github.com/KnpLabs/snappy para generar lo que necesites.

La opción que te comentan de usar algun sistema work queue para este tipo de situaciones es buena tambien, pero creo que 9 páginas no es demasiado, el problema de html2pdf es algo conocido https://github.com/spipu/html2pdf/issues/230#issuecomment-468619276 y recomiendo cambiarte a una libreria mas actual o usar lo que te comente mas arriba.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kathyu
Val: 1.803
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Tiempo excesivo en creación de PDF con html2pdf

Publicado por Kathyu (524 intervenciones) el 11/07/2019 23:42:50
La opción de KnpLabs/snappy es la que se usa con Symphony a menudo.

Pero, en su mayoría los que han trabajado con html2pdf ya migraron a mPDF. Es bueno tener mas opciones, por el momento mPDF esta trabajando bien, pero a futuro (si la cosa se complica) tendré que trabajar con algún modelo de los que habéis presentado.

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 6
Ha disminuido su posición en 8 puestos en PHP (en relación al último mes)
Gráfica de PHP

Tiempo excesivo en creación de PDF con html2pdf

Publicado por fernando (3 intervenciones) el 21/10/2019 16:44:40
cual fue la solución final a este problema? estoy pasando por un tema similar un PDF de mas de 50 pag con imágenes, como solucionaste tu problema?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar