php redis 怎么能无延迟处理队列?

需求是要通过服务器发送微信模板消息

目前使用的方案:
1、发送任务是先进redis队列里
2、然后crontab每分钟去执行出队列的发送任务
3、但是是每分钟去执行的,如何能无延迟去处理任务

============================分隔线==============================
补充:
首先感谢回复的亲们!

还有几个疑问想要咨询的
1、如果用脚本do.php,守护进程去处理,并通过定时任务脚本去监控这个进程,这样运行对服务器会产生多大的压力?还是可以忽略不计
2、如果采用其他的异步消息处理队列方法(主要需求是高频发送微信模板消息):
如用swool开启WebSocket,直接把任务发送至WebSocket去处理
这样的方法和采用 redis 守护进程去执行出队列的方法相比,会有哪些优点和不足的?

============================分隔线==============================
补充2:
又遇到几个问题

问题一:

在终端使用如下nohup命令,创建不了进程

nohup php /www/wwwroot/127.0.0.1/do.php &

后台切换终端目录至网站根目录下,再次运行nohup命令,创建进程成功了

cd /www/wwwroot/127.0.0.1
nohup php do.php &

不知道造成这个问题的原因是什么?
难道是do.php里面有include包含其他文件的关系吗?

问题二:

do.php脚本创建进程后,通过如下ps命令可以看到,重启服务器后,这个进程就没有了。
看了下shell语法,do.sh文件如下

#!/bin/bash
ps -fe | grep do.php | grep -v grep
if [ $? -eq 0 ]
then
    echo "runing"
else
    echo "not runing"
fi

但是一直提示如下错误

do.sh:行8: 未预期的符号 `fi' 附近有语法错误
do.sh:行8: `fi'

do.sh的语句应该没有问题啊

阅读 1.9k
评论
    8 个回答
    • 29
    while (true) {
        $result = $queue->get();
        if ($result) {
            $data = $result->getBody();
            sleep(3); //模拟处理过程
            $queue->ack($result->getDeliveryTag());
        } else {
            sleep(3);
        }
    }
    
    最后,再搭配supervisor.
    done.

    我用的是rabbitMQ,上面是consumer的伪代码