4

大きなhtmlテーブルをdompdfでpdfにレンダリングしようとしています。最小限の CSS スタイリングがありますが、テーブルにはおそらく 200 ~ 300 行あります。各行には、基本テキストを含む 4 つの td があります。

問題なく小さなテーブルの pdf を生成できますが、大きなテーブルはメモリ制限を使い果たし、スクリプトは終了します。これにアプローチする最良の方法は何ですか?私は serverfault に関する議論を開始し、あるユーザーは、php / apache のメモリ制限を使い果たさないように新しいプロセスを生成することを提案しましたか? これはこれを行うための最良の方法でしょうか?これは、dompdf が現在ダウンロードをブラウザにストリーミングしているため、それがどのように機能するかについての質問につながりますが、レポートを生成する新しいプロセスを作成すると、出力をブラウザに送信できなくなると想定しています。ダウンロードするユーザー?

これに取り組む良い方法を提案できる人に感謝します!

4

2 に答える 2

2

PDFだけでなく、生成されたさまざまなファイルタイプでこの問題が発生しました。問題は変数のサイズにあり、プロセスがどれほど新鮮であっても、変数は依然として大きすぎるため、生成プロセスは役に立ちませんでした。私の解決策は、変数が特定のサイズを超えないように、ファイルを作成して管理可能なチャンクで書き込むことでした。

基本的な、テストされていない例:

$tmp = fopen($tmpfilepath, 'w');
if(is_resource($tmp)) {
    echo 'Generating file ... ';
    $dompdf = new DOMPDF();
    $counter = 0;
    $html = '';
    while($line = getLineOfYourHtml()) {
        $html .= $line;
        $counter++;
        if($counter%200 == 0) {  //pick a good chunk number here
            $dompdf->load_html($html);
            $dompdf->render();
            $output = $dompdf->output();
            fwrite($tmp, $output);

            echo round($counter/getTotalLines()).'%... ';  //echo percent complete

            $html = '';
        }
    }
    if($html != '') {  //the last chunk
        $dompdf->load_html($html);
        $dompdf->render();
        $output = $dompdf->output();
        fwrite($tmp, $output);
    }
    fclose($tmp);

    if(file_exists($tmpfilepath)) {
        echo '100%. Generation complete. ';
        echo '<a href="'.$tmpfileURL.'">Download</a>';
    } else {
        echo ' Generation failed.';
    }
} else {
    echo 'Could not generate file.';
}

ファイルの生成には時間がかかるため、エコーが次々と表示され、画面がフリーズしたとは思わないようにユーザーに何かを見てもらうことができます。最終的にエコーされたリンクは、ファイルが生成された後にのみ表示されます。つまり、ユーザーはファイルをダウンロードする前に、ファイルの準備ができるまで自動的に待機します。このスクリプトの最大実行時間を延長する必要がある場合があります。

于 2013-04-24T22:17:14.747 に答える