做一个定时任务处理数据,每次处理10个,如果处理的太多就会出现问题
怎么做动态定时任务,查询待处理数据条数,如果大于10个,定时下一分钟执行,依次循环
如果单纯用PHP做,只能说PHP本身不擅长做这种事。不像JAVA在虚拟机里面开多几个线程就能解决。
如果没有接触过计划任务,可以尝试一下,linux的crontab。
另外要是根据不同的返回数量来决定不同的操作间隔,可以用计划任务+缓存来实现。
希望对你有帮助!
用linux的crontab
0.先看看下面的链接
1.vi /etc/crontab
*/1 * * * * root php yourPhpFile.php
2.每一分钟yourPhpFile.php脚本就会去查询并处理你的任务
总结:此处的crontab任务每一分钟执行一次,只是提供下大概思想所以不够高效,题主可以安排和设置出更为合理的定时任务
希望对你有所帮助
7 回答5.3k 阅读
4 回答4k 阅读
2 回答5.9k 阅读✓ 已解决
1 回答4k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
2 回答2.2k 阅读✓ 已解决
2 回答2.5k 阅读✓ 已解决
以前用redis+python搞过类似的东东,这个思路redis+PHP也可以做。其实很简单:
首先要有个redis服务器
假设一个任务队列就叫
job_queue
,类型使用list
起一个PHP脚本定时往里面加任务,比如
$redis->lpush('job_queue', "xxx");
,数据建议序列化为JSON字符串起10个PHP脚本来执行任务,可以采用会阻塞blpop来取任务并执行:
dealYourJob($redis->blpop('job_queue'));
-- 注意反序列化数据O了
至于【3】中的如何定时,既然你是用linux,建议直接用系统的crontab即可。
【4】中的脚本想并行多少个随时都可以增加或减少。
除了redis外,MySQL也可以用来搞这个队列,就是SQL语句写起来麻烦些。
redis本身是单线程的,
lpush
和blpop
都能保证原子性,比用MySQL要省心。