MPDFによるPDF生成が異様に重たくなる現象
MPDFはHTMLで書かれたコードをPDF化してくれる便利なライブラリです。
http://www.mpdf1.com/mpdf/index.php
CSSも基本的なコードであれば再現してくれますし、日本語も扱えるので表の書き出しや領収書などの書き出しによく使います。
このMPDFで領収書や請求書を発行するプログラムを組み込んだシステムを5年ほど前に作ったのですが、お客様から「サーバーを変えたらPDF生成に2分ほど掛かってしまう」というご相談を頂きました。
データベースから情報を取り出して生成していますので、そこに負荷が掛かっているのかと疑いましたが、DB処理を省いたシンプルなPDF生成プログラムを書いてみたところ、それでも重たい状態です。
MPDFは基本的に以下のように書きます。
require_once("mpdf.php"); $html = 'Invoice....htmlコード'; $mpdf=new mPDF(); $mpdf->WriteHTML($html); $mpdf->Output();
公式サイトを読んでもどうにも原因が解らず、また、作成したシンプルなプログラムを別なサーバーに設置すると軽快にPDFを生成してくれるので、サーバー側に原因があるのではないか?という事になりました。
サーバーはロードバランサーやファイアーウォールなど、高度なセキュリティを取り入れた専用サーバーなのですが、PHPなどの設定には特に問題は無いようで、とにかく原因が判らない状態。
で、結局何が原因だったかというと、MPDFに渡しているHTMLの中にある絶対URLで書いた画像ファイルが読み込めていなかったようです。
どうやらMPDFから外部URLのファイルをロードする処理とファイアーウォールの相性が悪いようでした。
ファイアーウォール側にMPDFに対するルールを書き加えるという方法を模索しましたが、既に可動しているシステムですので、不具合が出ると大変な事になりますので、画像自体をやめてフォントで対応する事になりました。
MPDFを使ったPDF生成が異様に重たくなった場合はファイアーウォールを見直してみると良いかもしれませんね。