【问题标题】:How can I insert a delay sql statement using PHP?如何使用 PHP 插入延迟 sql 语句?
【发布时间】:2011-06-21 14:21:04
【问题描述】:

我想为用户提供一个网站,当用户输入一些东西时,我会把它放到数据库中。但是当用户访问.php 时,该命令不会执行。我想在一段时间后执行....这是这样的......

10:00 am
User makes the request, and saying that the record will write in the DB one hour later. 

11:00 am 
The request execute, and the DB write a new record. 

我该怎么做?另外,我想为用户添加取消请求的功能.....像这样:

10:00 am
User makes the request, and saying that the record will write in the DB one hour later. 

10:30 am
User cancels the request.

11:00 am 
Nothing won't execute.

对此有什么想法吗?谢谢。

【问题讨论】:

  • 为什么会延迟?就不能直接把值写入数据库,加个时间戳,在等待期结束之前忽略所有太新的记录吗?

标签: php command execute


【解决方案1】:
  • 当用户输入时,将该输入保存在数据库表中,但将列(已验证)值设置为“0”
  • 一小时后,cron job 会将列(已验证)值设置为“1”
  • 如果用户在验证前取消,删除该记录

示例:

user_input

user_id | input |    input_time     | verified
   1    |  500  | 2011-01-01 12:20  |    1
   2    |  700  | 2011-01-01 01:20  |    0

  • 创建一个新表来存储输入请求
  • 一小时后,cron 作业会将所有请求传输到原始表。
  • 如果用户在一小时前取消,则从 requests 表中删除该记录。

示例:

user_input

user_id | input
   1    |  500 
   2    |  700 

user_requests

user_id  |  input  |    input_time
   3     |   200   | 2011-01-01 07:20   

【讨论】:

    【解决方案2】:

    cron 对此过于复杂。当您插入数据库时​​,有一个包含帖子应该上线的日期和时间的列。例如:

    $query = "INSERT INTO table (body, effective_date) VALUES ('body text', '" . strtotime('+1 hour') . "'";
    

    在显示您的内容的页面中,只需添加WHERE effective_date>=NOW(),它将排除待处理的条目。

    【讨论】:

      【解决方案3】:

      这是完成此任务的工作流程:

      1. 当用户发出请求时,将请求记录到文件中
      2. 创建一个 cron 作业来运行一个单独的 PHP 脚本,该脚本读取文件并将数据插入到数据库中
      3. 如果用户取消请求,请从文件中删除请求。

      在“文件”的位置,您还可以将对数据库的请求记录在“待处理”表中,并执行类似的操作。

      【讨论】:

        【解决方案4】:

        有一个不同的数据库表用于安排作业。用户可以在此表中添加、修改和删除作业。然后让 cronjob 每五到十分钟检查一次表,并执行当前时间的作业。

        【讨论】:

          【解决方案5】:

          如果您真的希望一小时后将记录输入数据库,则必须为您的条目创建某种 队列 并设置脚本(通过 Cron 或其他)检查一小时前的记录并将它们插入数据库。您尚未指定您正在使用哪个数据库,但据我所知,没有数据库可以让您选择执行 insert 命令但告诉它 在一小时前等待实际做到了

          如果您使用队列,那么您可以在用户创建队列时在其上添加时间戳,并且在该时间戳后的一小时内,用户可以取消记录。

          您的队列可能也应该驻留在您的数据库中,并且实际上可能是数据最终要进入的实际表。只需使用您的时间戳来查看是否已经过了一小时并将记录标记为不再cancelable(如果这个词存在的话……呵呵)。这意味着该条目实际上是在 一小时过去之前写入数据库的。但是您只需要根据创建后是否经过一个小时来过滤您的操作。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-09-15
            • 1970-01-01
            • 1970-01-01
            • 2013-05-19
            • 2021-12-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多