2011-04-12 56 views
0

我希望我能得到一些建议。PHP CRON作业与用户登录的调用函数

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

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

  • 有运行,每天一次(即中午12:00每一天)cron作业 - 通过每一个项目开始,在做的工作,如果日期条件得到满足。

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

    我很担心这种方法,因为:(1)如果我的服务器在我的CRON工作计划时关闭,CPANEL现在是否完全跳过? (2)如果我有100k甚至1亿条条目筛选,那么在运行时,这会对我的服务器造成难以承受的负载吗?

  • 调用此脚本在“做工作”,如果日期条件都满足,只有当相关用户登录。

    为什么我不喜欢这种方法尽可能多的原因,是因为它得到告诉申请多少发票越来越复杂,需要支付多少滞纳金。另外,我有一个“管理员”的用户谁可以看到每一个人每一件事 - 即用户可能有没有及时更新台账信息租客已没有足够的最近登录...

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

也许我在思考的东西。不知道...但建议将不胜感激。 谢谢。

+0

如果用户在一年内没有登录您的系统会怎么样 - 您不会向他发送发票? – zerkms 2011-04-12 02:26:22

+0

如果你每天都这样做,你真的希望有大量1亿行需要更新?对于你的第二种情况,我建议做2件事。 1.管理员查看特定用户时的计算结果。 2.如果您在页面上有任何统计数据,请给管理员一个按钮来同步数据。现在,因为用户可能永远不会返回,因为你的管理员可能是懒惰的。你可以尝试两种方法的组合。附:据我所知,如果cronjob失败。它被“跳过”。 – Khez 2011-04-12 02:29:59

+0

** @ zerkms ** - 当我看到您的观点时,事实仍然是我希望代码能够最终保持稳健...并且持续2-3个月,直到认真收集资金是很常见的... * * @ Khez ** - 我不会更新100Mil行,但我将不得不检查100Mil行... – Shackrock 2011-04-12 02:36:09

回答

1

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

就服务器负载而言,一次更新多条记录可能不会有太多问题。问题是,使用正确结构化的查询时,应该只根据具有与所选参数匹配的日期的记录进行更新(或插入)。你不需要实际循环数据库中的每个记录。

+0

您的意思是“交易安全”表是什么意思?我没有使用'INNODB',因为'myisam'对于“吨读”来说更好,“据我所知...(我的解决方案有更多的读取而不是写入)。 **进一步**,我仍然需要遍历每个记录来检查日期,对吧?我无法摆脱这一点。当然,我只需要在条件满足的情况下更新。 – Shackrock 2011-04-12 13:26:46

1

我认为cron工作是一个好主意。然而,你可能希望有某种方法将项目(行?)标记为“已处理”。你的cron工作应该寻找“未处理”的数据,而不是按日期。这是,恕我直言,更安全,并会解决问题,如果工作失败,出于某种原因运行。

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

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