0

何かアドバイスをいただければと思います。

PHP/MySQL システムに会計台帳があり、定期的に (この例では、月に 1 回としましょう) 請求書が発行されます。また、特定の日付以降に適用する必要がある遅延料金もあります。請求書の「転記」日と「これは遅れています」の日付はすでに DB にあります。

台帳項目を自動的に (月に 1 回) 適用し、延滞料金を自動的に入力する (必要に応じて月に 1 回) スクリプトを実行するには、どの方法がよいか考えています。システムのすべてのユーザーについて、これらの日付は異なります - そして、私が言ったように、すべて DB に保存されます。私が見ている私のオプションは次のとおりです。

  • 1 日に 1 回 (つまり、毎日午前 12:00) 実行される CRON ジョブを用意し、すべてのアイテムを処理して、日付条件が満たされた場合に作業を行います。

    毎日同じ時間にすべてを一度に処理するので、私はこの方法が好きだと思います。

    私はこの方法について心配しています: (1) CRON ジョブがスケジュールされたときにサーバーがダウンした場合、CPANEL はその日を完全にスキップしますか? (2) ふるいにかけるエントリが 10 万または 1 億ある場合、これを実行するたびにサーバーに耐えられないほどの負荷がかかりますか?

  • このスクリプトを呼び出して、日付条件が満たされた場合に「作業を実行」し、その関連ユーザーがログインした場合 にのみ実行します。

    私がこの方法をあまり好まない理由は、適用する請求書の数と適用する遅延料金の数を判断するのがますます複雑になるためです。さらに、私には「管理者」ユーザーがいて、誰からでもすべてを見ることができます-テナントが最近十分にログインしていない場合、そのユーザーは最新の台帳情報を持っていない可能性があります...

    私がこの方法を気に入っている理由は、明らかにサーバーの負荷が少ないからです...

たぶん、私は物事を考えすぎています。わかりません...しかし、アドバイスをいただければ幸いです。ありがとう。

4

2 に答える 2

1

あなたが言及したすべての利点のために、cronタブを使用するのが最善の策だと思います。INNODB などのトランザクション セーフ テーブルを使用し、cron タブの完了をログに記録すると、crontab 中にテーブルがクラッシュした場合、変更が元に戻され、ログをチェックして日付を確認できます。手動で変更できるようにクラッシュしました。実際、crontab タスクの完了をテーブルに記録すると、そのログを使用して (スクリプトが最後に実行されたのは何日前に実行されたかを取得)、欠落した日数を自動的に処理できます。

サーバーの負荷に関する限り、多くのレコードを一度に更新しても問題はほとんどないでしょう。問題は、適切に構造化されたクエリを使用すると、選択したパラメーターと一致する日付を持つレコードに基づいてのみ更新 (または挿入) する必要があるということです。データベース内のすべてのレコードを実際にループする必要はありません。

于 2011-04-12T02:46:17.687 に答える
1

cronジョブは良い考えだと思います。ただし、どちらの方法でも、アイテム (行?) を「処理済み」としてマークする何らかの方法が必要になるでしょう。cron ジョブは、日付ではなく「未処理」のデータを探す必要があります。これは、私見ではより安全であり、何らかの理由でジョブの実行に失敗した場合に問題を解決します。

私のアプリの1つに同様の機能があります。ただし、それはよりキュー スタイルです。タスクは、アプリケーションのどの部分からでもキューに入れられます。ワーカー (cron 経由でトリガーされる可能性があります) は、キューを通過してタスクを完了し、「処理中」としてマークしてから処理します。次のワーカーがやってきて「処理中」のタスクを見つけると、そのワーカーがゾンビではないことを確認します。存在する場合は、それを強制終了してから、タスクを再起動します。などなど

実際には、さまざまなタイプのタスク (電子メール通知、ファイル更新など) を保持できる 1 つのマスター キューがあり、ワーカーがマスター キューをジョブ固有のキュー (電子メール用など) に処理します。

于 2011-04-12T02:46:39.377 に答える