5

DomPDF の最新バージョン (0.6.0 beta 3) を使用しています。

PHP のバージョンは 5.2.17 です。

残念ながら、私は共有ホスティング アカウントを使用しており、PHP のアップグレードなどのアクションは利用できません。また、apache エラー ログにアクセスすることもできません。

memory_limitPHP を に2048M、を に設定しましmax_execution_time999。それらが効果を発揮したかどうかはわかりませんが。DomPDFがタイムアウトしたりメモリ不足になったりしていないように感じるので、実際には問題ではないと思います。ページをリクエストしてからわずか 10 秒後に 500 エラーが発生するようです。ページ数が少ない PDF を生成しようとすると、スクリプトに時間がかかりますが (12 ~ 15 秒)、正常に終了します。

サイズが 72.3kb で、小さな HTML テーブルが 1 つしかない HTML ファイルがあります。(実際、表のあるページを削除しても問題は解決しません。) PDF は約 35 ページになるはずです。

何度も掘り下げた後、30ページ目から31ページ目、関数page_frame_reflower.cls.php内の次のコード行でエラーが発生することがわかりました。reflow

  // Render the page
  $this->_frame->get_renderer()->render($child);

各ループ(ページ)でechoingすると、値はかなり一貫しており、使用可能なメモリの 5% 未満のようです。memory_get_usage

get_classonを使用し$this->_frame->get_renderer()て、問題の関数がRenderer::render().

残念ながら、現在の方法でデバッグを続ける簡単な方法はありません。このメソッドRenderer::render()では、カウンター変数をパラメーターに追加できません。これは、親関数と互換性がある必要があるためです。

誰かが私のために何か助けてくれました。私が見逃しているものはありますか?これらの 500 エラーを修正するための正しい方向を教えてもらえますか?

編集: HTML ドキュメントからインライン PHP の使用をすべて削除しましたが、何も変わっていないようです。

編集 2:ドキュメントが大きすぎて Tidy を完全に実行できませんでしたが、最大 50000 バイトまでエラーはありませんでした。

編集 3: PHP エラー ログがオンになっています。間違ったメソッド名などを呼び出すと、エラーが発生する可能性があります。これらのエラーが画面に表示されます。実際、問題のメソッドの前に無限ループを引き起こした場合でも、PHP の最大実行時間に達したというエラーが画面に出力されます。ただし、問題領域には 500 Internal Server Error ページが表示されます。

編集 4:すべての CSS を削除し、スタイリングなしで PDF を生成しました。今、私たちはどこかに到達しています。ゆっくりと CSS を追加し直して、問題のコードを絞り込むことができます。ありがとう、@リヴ。

編集 5: CSS を問題の芽 (h1 ルール) に絞り込みました。h1タグで背景画像を使用していました。したがって、元の問題から、h1タグから背景画像を削除して、PDFを適切に機能させるだけで済みました。背景画像を含む多くの要素を処理することは DomPDF の問題ですか?

編集 6:これがHTML ファイルです: http://www.pickering-mcaloon.com/wp-content/uploads/2013/03/test2.html このバージョンの HTML を DomPDF でテストしたところ、500 サーバー エラーが発生しました。私のヘッダー画像は 25.1 kb です。すべてのページのフッターも背景画像を使用しており、正常に機能することに注意してください。この HTML のコピーでは、1 つの「章」セクションを削除することで、DomPDF が PDF の生成を完了することができました。

編集 7:私が最初に使用した問題に遭遇したとき、 が呼び出されるmemory_get_usageループの先頭でRenderer::render()、毎回わずかに異なる使用法が示されましたが、最大値の 6% 未満で、 に設定されていました2048Mrenderを呼び出す前にこれらのタイプのエラーを生成し、PHP エラーを画面に表示できるため、この問題がタイムアウト エラーまたはメモリ エラーであるとは考えていません。また、実行時間の約 10 秒後に 500 エラーが表示されます。PDF が機能する場合、約 15 ~ 20 秒かかります。したがって、タイムアウトはほとんどありません。おそらくメモリエラーですが、もしそうなら、 への呼び出しの前にメモリがオーバーフローした場合と同じように、エラーを出力しないでくださいrender

編集 8: h1 タグの背景画像として使用していた画像を PNG から JPG に変換しました。これにより、サイズが 25.1kb から 2.6kb に縮小され、PDF が適切に生成されました。これはおそらくメモリの問題です。PHP はエラーを生成して表示するはずですが、表示されません。

4

4 に答える 4