0

私はTCPDFを使用してPDFドキュメントをその場で作成しています。これらの PDF を生成するクエリの一部には 1,000 以上のレコードが含まれており、サーバーがより大きなクエリでタイムアウトになります (内部サーバー エラー)。PHPとMySQLを使用しています。

サーバーのタイムアウトを防ぐために、AJAX を使用して大きな MySQL クエリを解析し、データをキャッシュして、結果を再結合するにはどうすればよいですか?

これが私の現在のコードです:

require_once('../../libraries/tcpdf/tcpdf.php');

$pdf = new TCPDF();

$prows = fetch_data($id);

$filename = '../../pdf_template.php';

foreach ($prows AS $row) {

    $pdf->AddPage('P', 'Letter'); 
    ob_start(); 

    require($filename);

    $html .= ob_get_contents();
    ob_end_clean();

    $pdf->writeHTML($html, true, false, true, false, '')

}

$pdf->Output('documents.pdf', 'D');
4

2 に答える 2

0

PEARcache_liteのような単純なキャッシュを試してください。遅い期間またはオフ期間中に、必要なすべてのレコードを実行およびキャッシュするユーティリティプログラムを作成できます。次に、ユーザーがPDFを要求すると、データベースにアクセスしなくてもキャッシュデータにアクセスできます。さらに、テーブルのタイムスタンプフィールドを使用して、データがキャッシュされてから変更されたデータベースレコードを要求できます。これにより、データベースからリアルタイムで取得する必要のある現在のレコード数が大幅に減少します。

<?php
include 'Cache/Lite/Output.php';
$options = array(
    'cacheDir' => '/tmp/cache/',
    'lifeTime' => 3600,
    'pearErrorMode' => CACHE_LITE_ERROR_DIE,
    'automaticSerialization' => true
);

$cache = new Cache_Lite_Output($options);
if( $data_array = $cache->get('some_data_id') ) {
    $prows = $data_array;
} else {
    $prows = fetch_data($id);
    $cache->save($prows);
}

print_r($prows);

?>
于 2012-06-26T13:55:27.457 に答える
0

これが呼び出されるたびにデータを生成することが絶対に必要な場合は、クエリを 100 行のブロックにチャンクし、データをファイルシステム (または、APC/WinCache/XCache/MemCache) にキャッシュすることができます。最後の AJAX 呼び出し (Finalquery=true) で、キャッシュをロードし、PDF を生成し、キャッシュをクリアします。

次のようにスクリプトの最大実行時間を変更できないと仮定しています<?php set_time_limit(0);

フローは次のようになります。

  • クエリ アクションの一意の ID を生成する
  • クライアント側では、php スクリプトへの最初の呼び出し (select count... など) を通じて最大行数を取得します。
  • 次に、それを 10、100、1000 で分割しますが、それを分割したい要求の数に関係なく分割します。
  • 一意の ID を使用して、これらのチャンク (行 0、100、100、200) のそれぞれに対して AJAX 要求を実行します。
  • サーバー側では、その数/行の選択を選択し、それをどこかのストアに入れます。私は WinCache に精通しているので (Windows で PHP の開発に行き詰まっています...)、それをユーザーキャッシュに追加します。wincache_ucache_add( $uniqueId . '.chunk' . $chunkNumber, $rows);
  • それまでの間、クライアント側ですべての AJAX リクエストを追跡します。それぞれが終了したら、Generate PDF 関数のサーバーサイドを呼び出します。チャンクの数と一意の ID を指定します。
  • サーバー側では、キャッシュからすべてを取得します。$rows = array_merge( wincache_ucache_get($uniqueId . '.chunk'. $chunkNumber1), wincache_ucache_get($uniqueId . '.chunk'. $chunkNumber2) );
  • キャッシュをクリアします。wincache_ucache_clear();
  • PDF を生成して返します。

手動で、または抽象化レイヤーまたは ORM の機能を使用して、一般的にクエリ結果をキャッシュする必要があることに注意してください。

于 2012-06-26T02:04:01.577 に答える