2012-03-06 34 views
2

500+ページのブックレットにPDF(TCPDFを使用)を生成するサイトの機能を構築しています。レイアウトは非常にシンプルですが、レコードの数が「長時間実行されているPHPプロセス」と見なされていると思います。これは一年に一度だけ行う必要があり、私はそれがバックグラウンドで実行され、管理者にメールが送信されればそれは完璧です。 Cronと見なされていますが、ユーザーが生成したタイプの機能です。タイムアウトのない長いTCPDF文書の作成(長時間実行されているPHPプロセス)

PDFレンダリングをしている間、何度も何をすることができますか?私はPHPで "良い"とはいえ、* nixではあまり好きではありません。チュートリアルのリンクでさえ助けになります。

答えて

1

必要なのは、PHPスクリプトの許容最大実行時間を変更することです。スクリプト自体からいくつかの手段で行うことができます(もしうまくいくなら、これを好むべきです)か、php.iniを変更します。

BEWARE - 実行時間を変更すると、サーバーのパフォーマンスが著しく低下する可能性があります。スクリプトはパーサによって終了される前に特定の時間(デフォルトでは30秒)だけ実行することができます。これは、記述の悪いスクリプトがサーバーを縛るのを防ぐのに役立ちます。あなたはこれをする前に、あなたがしていることを正確に知るべきです。

について、あなたはいくつかのより多くの情報を見つけることができます:set_time_limit()によってここにhttp://www.php.net/manual/en/info.configuration.php#ini.max-execution-time

  • をphp.iniでmax-execution-timeを設定

    PS:これがあれば動作するはずですPHPを使用してPDFを生成します。スクリプトの外で(exec()system()などで呼ばれる)いくつかのものを使用すると動作しません。

  • 3

    正直に言えば、これはスケーラビリティの観点から完全には避けるべきです。私はデータベーステーブルを使用して、パラメータを使ってジョブを「スケジュール」し、このテーブルを継続的にチェックしているスクリプトを作成します。次に、JavaScriptを使用してアプリケーションが "準備完了"になったことをポーリングします。ファイルが準備できたら、JavaScriptがファイルをクライアントにプルダウンします。

    私のWebサーバーがなぜ非常に遅いのか不思議に思っている間は、このプロセスを維持したりトラブルシューティングするのは非常に難しいでしょう。 Apacheは、どのプロセスがどのCPUを食べているのかを簡単に判断することはできません。

    また、データベースを使用することで、同時スレッドの数を制限したり、複数のプロセスで各PDFページをレンダリングしてさらにレンダリング時間を短縮することができます。 。

    幸運!

    -1

    この質問はすでに答えが、ここでは他の質問/回答の結果として、ここで私がやったことであり、それは素晴らしい仕事をされています(私はpdftkを使って同じことをしましたが、小さい規模で!)

    私は、iframe内に以下のコードを置く:

    set_time_limit(0);     // ignore php timeout 
    //ignore_user_abort(true);   // optional- keep on going even if user pulls the plug* 
    while(ob_get_level())ob_end_clean();// remove output buffers 
    ob_implicit_flush(true); 
    

    これは、ページの読み込みタイムアウトを回避。親ページにカウントダウンまたはプログレスバーを置くことができます。私はもともとiframeに進捗状況の更新を親に返してもらいましたが、ブラウザの更新がそれを破りました。

    関連する問題