我需要一些关于最好的方法的建议。我正在开发一个web应用程序,监控数据流,并将其添加到数据库。然后,它根据特定标准的规则集检查它。如果满足其中一个条件,它需要在x分钟后对同一条目运行一个特定的查询。(x由用户config设置)。
我在想一种方法是让它创建cron工作,但首先,我不知道如何做到这一点,其次,我想知道是否有更好的方法。
条目收到->匹配条件->等待X分钟->执行另一个查询。
我需要它在不暂停脚本的情况下完成此操作,因为大量数据将进入,所以如果它等待10分钟,它将无法处理所有数据。
谢谢!
如果有许多类似的任务,您可以为任务创建一个表,并在需要时填充它。
然后,每分钟运行一次的cron脚本可以从该表中选择所有执行时间小于或等于当前时间的表项并运行它们
不要创建多个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
表中删除。
第一个也是最简单的方法:
学习计划。<标题>第二种方式:
如果你想等待10分钟而不停止脚本的执行,用户将不得不等待10分钟。
如果你想在不打扰用户的情况下执行这个操作,你可以创建一个子进程来处理这个操作。这个过程不会停止,但是与用户的交互将会结束。在子进程中,您可以暂停脚本10分钟。
如何创建子进程:http://php.net/manual/en/function.pcntl-fork.php
如何暂停进程:http://php.net/manual/en/function.sleep.php
标题>我自己用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