3

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

目前使用的方案:
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的语句应该没有问题啊

nemesiszh 332
2019-04-02 提问

查看全部 8 个回答

0
while (true) {
    $result = $queue->get();
    if ($result) {
        $data = $result->getBody();
        sleep(3); //模拟处理过程
        $queue->ack($result->getDeliveryTag());
    } else {
        sleep(3);
    }
}

最后,再搭配supervisor.
done.

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

推荐答案

3

已采纳

要做到无延迟处理,就只能起一个常驻内存的 php 服务,可以写成 php 脚本,然后 nohup 启动,阻塞监听 redis 消息

代码参考

while(true) {
    $result = $redis->brpop(REDIS_KEY, 0);
    var_dump($result);
}

疑问解答:

  1. 忽略不计,除非监控脚本有问题
  2. 直接发给 socket 而不是队列,相当于把压力都给到 socket 服务
    优点: 少了一环,架构变简单,消息链路短,反馈效果好
    缺点: socket 所在服务要承担更高的压力

补充2:

  1. 使用 nohup 如果不指定日志文件,会有一个叫 nohup.out 的日志文件在执行目录,看一下报错信息
  2. 怀疑是换行符的问题,用 dos2unix 改为 Linux 换行符: dos2unix do.sh。遇到这种诡异的问题,如果确认语法没问题,可以尝试在新文件重写一次(不要复制)

推广链接