2

我需要一些关于最佳方式的建议。我正在开发一个 Web 应用程序来监视数据流并将其添加到数据库中。然后它根据特定标准的规则集对其进行检查。如果满足其中一个条件,则需要在 x 分钟后对同一条目运行特定查询。(x 由用户配置设置)。

我在想一种方法是让它创建 cron 工作,但首先,我不知道该怎么做,其次,我想知道是否有更好的方法。

收到条目 -> 匹配条件 -> 等待 X 分钟 -> 执行另一个查询。

我需要它在不暂停脚本的情况下执行此操作,因为会传入大量数据,因此如果等待 10 分钟,它将永远不会处理所有数据。

谢谢!

4

4 回答 4

2

如果有很多类似的任务,您可以为任务制作一个表格并在需要时填充它。

然后,每分钟运行的 cron 脚本可以从该表中选择执行时间小于或等于当前时间的所有条目并运行它们。

于 2013-03-12T19:10:49.580 回答
1

不要创建多个 cron 作业。

将用户配置存储为时间戳(将来),并有一个频繁运行的 cron 作业(每 1 分钟为最大值)并将查询用户配置列表以查看是否需要执行另一个查询。

存储 cron 作业的最后执行时间并让它查询列表 -

SELECT * FROM `pending_queries` WHERE `execution_ts` <= {$last_execution_ts}

一句警告

如果某些查询需要更长的时间来执行,您将面临一个或多个查询的执行时间可能重叠的风险。为了解决这个问题,一旦您在待处理的查询中提取数据,您应该使用标志将其is_processing标记为行中的其他字段。所以你的查询现在变成 -

SELECT * FROM `pending_queries` WHERE 
  `execution_ts` <= {$last_Execution_ts} AND `is_processing`=0

最后,在处理完查询后,您应该将其从pending_queries表中删除。

于 2013-03-12T19:15:47.943 回答
0

第一种也是最简单的方法:

学习 cronjob。

第二种方式:

如果您想等待 10 分钟而不停止脚本执行,则用户必须等待 10 分钟。

如果您想在不打扰用户的情况下执行此操作,您可以创建一个处理此操作的子进程。该过程不会停止,但与用户的交互将结束。在子进程中,您可以将脚本暂停 10 分钟。

如何创建子进程: http: //php.net/manual/en/function.pcntl-fork.php

如何暂停进程: http: //php.net/manual/en/function.sleep.php

于 2013-03-12T19:10:01.017 回答
0

我使用 JS/JQuery 和 PHP 为自己解决了类似的问题。这是它的一种伪代码:

  pingTimer = 0;
  function pingTimerIncrement() {
     //your criterias to be checked here either using plain 
     //JS or AJAX to do it on server side
     if (criterias met) {
       pingTimer += 1; //increase by 1 minute

       if (pingTimer == YOUR_USER_CONFIG_MINUTES) {
          //code to update your database using ajax
       }
     }
  }

  $(function() {
     var timerInterval = setInterval("pingTimerIncrement()", 6000); //1 minute
  });

另一种方式,如果你不想使用 JS/JQuery 然后使用cronjob

于 2013-03-12T19:10:19.703 回答