0

我希望我能得到一些建议。

我的 PHP/MySQL 系统中有会计分类帐,发票每隔一段时间就会进入分类帐(对于这个例子,我们只说一个月一次)。我也有滞纳金需要在某个日期之后申请。发票的“过帐”日期以及“这是迟到的”日期已经在数据库中。

我想知道哪个是运行我的脚本的更好方法,该脚本自动应用分类帐项目(每月一次) - 并自动输入滞纳金(如果需要,也将每月一次)。对于系统的所有用户来说,这些日期都是不同的——就像我说的,它们都存储在数据库中。我看到的选择是:

  • 有一个每天运行一次的 CRON 作业(即每天上午 12:00) - 并遍历每个项目,如果满足日期条件则开始工作。

    我想我喜欢这种方法,因为它可以同时处理所有事情,每天都在同一时间。

    我担心这种方法是因为:(1)如果我的 CRON 作业被安排时我的服务器宕机了,CPANEL 现在会完全跳过那一天吗?并且 (2) 如果我有 100k 甚至 100Million 条目要筛选,那么无论何时运行,这对我的服务器来说都是一个无法承受的负载吗?

  • 如果满足日期条件,则在相关用户登录时调用此脚本以“工作”。

    我不太喜欢这种方法的原因是,要申请多少张发票以及申请多少滞纳金变得越来越复杂。此外,我有一个“管理员”用户,他可以从每个人那里看到一切——如果租户最近没有足够的登录,那么该用户可能没有最新的分类帐信息......

    我之所以喜欢这种方法,是因为它显然是服务器上的负载较小...

也许我想太多了。不确定......但建议将不胜感激。谢谢。

4

2 回答 2

1

我认为最好的选择是使用 cron 选项卡,以获得您提到的所有好处。我要补充一点,如果您使用事务安全表(例如 INNODB)并记录 cron 选项卡的完成,如果表在 crontab 期间崩溃,则更改将被还原,您可以检查日志以查看日期有崩溃,以便您可以手动进行更改。事实上,如果您在表中记录 crontab 任务的完成,您可以使用该日志(获取脚本上次运行的天数)来自动处理错过的天数。

就服务器负载而言,一次更新许多记录可能不会有太大问题。问题是,通过正确结构化的查询,您应该只根据日期与您选择的参数匹配的记录来更新(或插入)。您实际上不需要遍历数据库中的每条记录。

于 2011-04-12T02:46:17.687 回答
1

我认为 cron 工作是个好主意。但是,无论哪种方法,您都可能希望有某种方式将项目(行?)标记为“已处理”。您的 cron 作业应该寻找“未处理”的数据,而不是按日期。这是,恕我直言,更安全,如果作业由于某种原因无法运行,将解决问题。

我的一个应用程序中有类似的功能。但是,它更像是一种队列样式。任务从应用程序的任何部分放入队列。一个工作人员(可以通过 cron 触发)通过队列并完成任务并将其标记为“正在处理”,然后进行处理。如果下一个工人出现并找到一个任务“处理”,它会检查工人以确保它不是僵尸。如果是,则将其杀死,然后重新启动任务。等等等等等等

我实际上有一个主队列,可以保存各种类型的任务(电子邮件通知、文件更新等),然后一个工作人员将主队列处理成特定于作业的队列(一个用于电子邮件等)。

于 2011-04-12T02:46:39.377 回答