1

さて、私は現在のプロジェクトの段階に来て、請求書発行を実装します。それについて考えると、皆さんがこの問題にどのように取り組むかがわかると思いました。関連する場合は、CodeIgniter、jQuery、jQuery UIを使用しており、PHP5.3とApache2.2.16を実行しているサーバーを完全に制御できます。本番サーバーはDebianSqueezeを実行しています。

だから私の質問はこれです。

  • 私が開発しているアプリは請求を処理します
  • 請求書は、1つずつ、またはバッチで(日付範囲から)作成できます。
  • すべての請求書にはPDFが生成され、サーバーに保存されている必要があります。私はmPDFを使用しています。
  • 一部の請求書は顧客に電子メールで送信できますが、その他の請求書はPDFで送信し、可能であればPHPから直接プリンター(lpr -p?)に送信する必要があります。
  • 請求書の実行は通常隔週で実行されます
  • 請求書の実行には、通常、100を超える請求書の生成が含まれる場合があります
  • 一部の請求書は適度に大きくなる可能性がありますが、通常のPDFサイズは請求書あたり2〜5ページになる可能性があります

基本的にいくつかのヒントが欲しいです。私がアドバイスを求めている主な分野は次のとおりです。

  • バッチ請求-これが1つのブラウザー要求を介して行われた場合、数分かかる可能性があり、PHPは最大実行時間を超える可能性があります。おそらく、通常はAJAXを介して実行できると思いました。この場合、jQueryは作成する請求書のリストを取得し、リストをループして、PHPにPDFを作成して請求書を処理するように要求します。では、1つの大きなリクエストの代わりに、小さなリクエストがたくさんありますか?これはお勧めですか?より良いアプローチはありますか?
  • バッチ印刷。ユーザーは、実行ごとに数十の請求書を手動で印刷する必要があることを心配しています。当然のことながらそうです。PHPからローカルプリンターへのバッチ請求書の印刷を処理するための最良の方法は何ですか?ボックスを使用してプリンタに出力を送信することについて読んだことがlprありますが、たとえば100個のPDFのバッチ手順中に、いくつかが失われる可能性があるのではないかと心配しています。もっと良い方法はありますか?
  • 進捗状況の報告。典型的なスピニングホイールを持つことは退屈になる可能性があり、ユーザーがより詳細な進捗状況の更新を要求していることを私は知っています。これについて何かアドバイスはありますか?上記の多くの小さなリクエストの方法で、AJAXレポートを簡単に作成できることを知っています:Cust1のPDFを作成しています...完了...Cust1にPDFをメールで送信...完了...顧客2のPDFを作成しています...等々。
  • データベースのACIDityとエラー処理。請求は大きく、関係する金額に明らかに敏感です...トランザクションのアプリケーションロジック、PDF生成エラー/電子メールエラーを処理して請求書をロールバックするなどに関するヒントは素晴らしいでしょう。

これはアドバイスに任せておきます。あなたが惜しまないかもしれないどんなヒント、提案またはコメントもありがたいことに受け取られるでしょう。

どうもありがとう。

4

2 に答える 2

1

そのようなジョブをブラウザから実行することは決してお勧めしません。これは、コンソール スクリプトとして実行するのが最も適切です。これで、必要に応じてブラウザーからコンソール スクリプトを開始できるようになりました。

コンソール ジョブとして、ブラウザやブラウザからサーバーへの接続によってプロセスが中断されることを心配する必要はありません。

おそらく、最初に請求書のすべてのデータ処理を行い、そのプロセスがアトミックであることを確認します。次に、後でPDFを作成して生成します。技術的には、いつでも請求書データから PDF を再生成できるはずです。

于 2011-06-14T22:33:05.897 に答える
0

今これを達成し、他の人に見てもらうために使用したソリューションを投稿すると思いました。

  1. datasageからの推奨に従って、私は最初にデータベース処理を(MySQLトランザクションを使用して)実行するための堅実な手順を書くことに集中しました。

  2. /invoicing/pdf/123次に、個々の請求書を処理する機能を作成しました(たとえば、mPDFを使用して1つのPDFを作成し、1つのPDFを電子メールで送信します)。/invoicing/send/123

  3. バッチのクライアント側の手順では、最初に、送信する必要のある請求書番号のJSONオブジェクトを、関連する顧客名と送信するURIとともに返すサーバー側リスナーを作成しました。

     {"invoice_number":1,"customer":"Acme Inc.","uri":"/invoicing/send/1"},
     {"invoice_number":2,"customer":"Another Company","uri":"/invoicing/send/2"},
     {"invoice_number":3,"customer":"Yet Another.","uri":"/invoicing/send/3"},
    
  4. あなたは私がこれでどこに行くのかを見ることができます。最後に、JSONをループしてリクエストを行うクライアント側のJavascriptを作成しました。しかし、私が見つけた問題は、$.ajaxまたは他のネイティブjQuery呼び出しを使用することであり、リクエストはすべて一度に発生し、Chromeはサーバー接続を6つに制限しているため、6つの請求書のみが送信されます。$.ajaxさらに、使用に切り替えるとasync:false、すべてのリクエストが成功するまでブラウザがフリーズしていました。そこで私はこのプラグインに出くわしました:http://plugins.jquery.com/project/ajaxqこれはAJAX呼び出しを「キューに入れ」、必要な効果を提供します。

  5. 最後に、私が持っていたクライアント側のコードは次のようになります。

        $(batch).each(function(key,value){
    
            // TODO: make this better
            // For now, uses a plugin which enables us to carry out sequential/synchronous AJAX calls to the server
            $.ajaxq("batch_email", {
                url: value.uri,
                format: 'json',
                success: function(response) { 
                    completed++;
                    $('#progress').val(completed);
    
                    if (response.result == "error") {
                        $('#batch_status').append('<p class="notification error">Failed: '+value.customer_name+'</p>');
                    }
    
                    if (completed != num) {
                        $('#text').html('<img src="'+base_url+'static/img/spinner.gif" style="vertical-align:middle;margin-right:10px;" />'+batch[key+1].customer_name+'...');
                    } else {
                        $('#text').html('Finished');
                        $('#progress').after('<div class="tc"><a href="'+base_url+'customer_invoicing" class="blue button">Return to invoicing</a></a>');
                    }
                }
            });
    
        });
    

展開する前に少し整理する必要がありますが、確かに機能します。ご覧のとおり、HTML5プログレスバーを使用して、プロシージャの実行中の進行状況を表示しています。

これが、今後数週間/数か月でこの投稿に遭遇する可能性のある人に役立つことを願っています!

幸運をお祈りしています

于 2011-08-05T00:33:58.167 に答える