【问题标题】:How to implement scheduled events in PHP/MySQL Web application如何在 PHP/MySQL Web 应用程序中实现计划事件
【发布时间】:2011-09-25 19:03:49
【问题描述】:

我正在使用 PHP/MySQL 开发 Intranet Web 应用程序。我的问题是关于预定事件:我每年有 2 个重要日期(让我称它们为 date_01 和 date_02),系统必须更改员工签到的开始时间。例如,在 date_01 签入从 x 时间开始,而在 date_02 签入从 y 时间开始。好像夏天的入住时间和冬天的入住时间不一样……

从软件工程的角度来看,您认为实现这一目标的最佳方式是什么?
-> Cron 工作?
-> MySQL 预定事件?
-> 如果可能的话,一个特定的 PHP 技巧?
-> 你的建议?

谢谢

【问题讨论】:

  • 你想做什么?要在特定日期更改数据库中的值?
  • 是的,我想在夏季时更改签到开始时间(在数据库中),并在冬季时再次更改。

标签: php mysql scheduled-tasks


【解决方案1】:

我认为您根本不需要计划任务。你可以有一个这样的表:

check_ins (valid_from, valid_until, check_in_start_time)

然后当你需要在你的 web 应用程序中获取当前的签到开始时间时执行以下操作:

select check_in_start_time
from check_ins
where
    now() >= valid_from and
    now() < valid_until

【讨论】:

  • Karolis,您的解决方案非常简洁明了。我喜欢它。
  • 我更喜欢 cron 工作,但我认为它可能会降低系统的可移植性,因为您需要在新服务器上实现 cron。 Karolis 解决方案还允许管理员从 Web 控制面板设置他/她想要的时间间隔。从优秀的软件工程的角度来看,你们怎么看?
【解决方案2】:

我通常用系统的 cron 来做这种尝试

为外部解释器创建一个带有经典标记的文件,然后是标签内的php代码

#!/usr/bin/php -f
<?php

    function hello_world(){ echo "hi!"; }
    hello_world();

?>

然后使用 chmod a+x my_php_files_with_commands.php 使其可执行,并在 cron 中添加所需计划的条目。您可以即时访问应用程序的 php 函数,只需添加所需的 require() 调用并使用它。数据库访问,文件访问,等等……除了(显然)与会话有关的任何事情。小心点。

编辑:对于那些说不作为 cron 执行此操作的人...您是否意识到如果有人在选定的日期在 Intranet 中执行某些操作,则代码将被执行?这意味着您将需要有人实际使用 Intranet 做某事,而不是在所选日期执行的操作。万一那天没有人进内网呢?

【讨论】:

    【解决方案3】:

    我根本不会将它作为一个预定的工作来实现——我会让代码根据它正在处理的日期来处理场景。

    在此级别修改系统状态意味着如果翻转失败,您将陷入混乱。这也意味着您无法轻松测量历史数据。

    如果不进一步了解系统正在做什么,就很难准确地说出应该如何实现这一点。一种方法是对逻辑进行硬编码,例如在 MySQL 中......

     SELECT emp_id, 
       STRTODATE(CONCAT(DATE_FORMAT(clock_in_time, '%Y-%m-%d '), 
         IF(DATE_FORMAT(clock_in_time, '%m') 
             BETWEEN '05' AND '08', '08:00', '09:00'))) 
         AS expected_clockin,
       clock_in_time AS actual
     FROM clockin
    

    或者使用查找表....

    SELECT a.emp_id,
      STRTODATE(CONCAT(DATE_FORMAT(a.clock_in_time, '%Y-%m-%d '),
         b.start_time) 
      AS expected_clockin,
       a.clock_in_time AS actual
     FROM clockin a INNER JOIN lookup b
        ON a.clock_in_time BETWEEN b.period_start AND b.period_end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-26
      相关资源
      最近更新 更多