我有一种特殊情况,我需要查询服务,以便在每天的特定时间获取n个用户的信息。问题是,如果我一下子完成所有操作,它会使服务脱机/崩溃。
所以要克服这个问题,最好每隔10秒左右为x个用户运行一次,直到x = n,然后停止。
我可以设置每天运行1个cron脚本,另一个每10秒运行一次。例如,每日脚本会将DB中的值设置为1('开始查询')(默认值为0表示关闭),然后第二个脚本(每10秒运行一次)将此数据库值检查为1。设置为true然后迭代通过用户一次查询服务x用户并递增同一数据库表中的另一列以跟踪它在列表中的位置。
此解决方案的问题(根据我的说法)是每10秒运行的第二个脚本每次都要查询数据库,以确定“开始查询”设置是否设置为1.这可能是相当的处理器重。有没有人有更好的解决方案?
注意:代码是用PHP编写的 - 由于服务器上php脚本的最大执行时间而无法使用睡眠
我可以在python中同样执行此操作,是否有最大限度执行cgi脚本?
答案 0 :(得分:5)
为什么不只是每天运行一个cron脚本,并且每隔十秒调用另一个脚本,直到另一个脚本完成它为止(例如返回一个“不再需要处理”的值)?
或者一个每天运行的脚本,只是循环遍历用户块,每个X用户都在睡眠()...
请记住,使用CLI version of PHP时,您不受执行时间限制的约束,并且您可以使用标准错误和输出流等与cron和其他shell脚本进行非常好的交互。
例如,对于第一种方法,您甚至不必使用PHP作为“控制”脚本 - 一个非常简单的shell脚本,只需循环,调用PHP脚本然后休眠,并检查“成功“返回值(由PHP脚本的exit()函数返回)将没问题。
答案 1 :(得分:1)
您可以将'at'与'cron'结合使用。设置一个每天运行一次任务的cron作业,并且该任务是(我目前没有在我面前的UNIX框,因此可能存在奇怪的语法错误)。
0 9 * * * at now + 10 secs /path/to/shellscript 1
参数是运行计数。当shellcript运行时,它会重新安排自己运行,增加运行次数,所以你可以:
#!/bin/ksh
integer i
let i=1+$1
if [[ $i -lt 11 ]]
then
at now + 10 secs /path/to/shellscript $i
# do everything else the script needs to do
fi
注意:此解决方案还假设“at”可以降至每秒一次(不确定是否可能;可能取决于实施)。如果它没有这个解决方案可能从关闭无效:-)在这种情况下你最好有一个脚本做东西和睡觉(根据马特吉布森的答案)。
答案 2 :(得分:0)
有多种方法可以做到这一点: