我现在想实现一个功能,功能是这样的:
用户在关注微信服务号 5 分钟后 ,判断他有没有在服务号的 h5 网页里付款, 如果没有付款,就在服务号里自动发送一条客服提醒消息给这个用户,催促他行动
现在有一个 php 库叫 easywechat,当用户在服务号触发各种行为的时候,很容易去实时自动回复,
但我如果想五分钟后回复,是不是用 php 的 sleep 5min 来暂缓执行发送客服消息的命令吗 但这样如果多个用户同时进来,会不会服务器内存爆掉,
还是说要把用户的 openid 存到数据库里,再做,但是这样太复杂了,作为计算机二级代码水平的我来说,有点困难
easywechat 文档: https://www.easywechat.com/docs/4.1/official-account/messages
1
agdhole 2019-04-22 09:23:34 +08:00
放到队列
|
2
xh520630 2019-04-22 09:36:40 +08:00
sleep(300) 应该可以吧 但是用在这种地方还是觉得怪怪的...
|
3
PHPJit 2019-04-22 09:37:05 +08:00
延时队列
|
4
zy445566 2019-04-22 09:37:23 +08:00
不行,你的 work 池很快就会被占满,你自己 ab 下就知道了。node 就可以,就是 sleep 可能会有几秒钟偏差
|
5
AZZERO OP @agdhole 谢谢解答 队列对我来说还是太复杂了,
如果不判断付款,仅仅在新用户关注 5min 后推送一条客服消息,有没有更简单的方式呢 |
6
guyujiezi 2019-04-22 09:39:44 +08:00
|
7
Takahashi 2019-04-22 09:47:37 +08:00
swoole 对你来说应该还是比较难上手的。。你可以考虑再写个脚本做一个 crontab 来检查是否付款,sleep5 分钟会炸
|
8
C603H6r18Q1mSP9N 2019-04-22 09:48:49 +08:00
放到数据库,然后每 10s 跑下
|
9
triptipstop 2019-04-22 09:49:31 +08:00
PHP 里 或者说 Web 里 所有不能秒级完成的事情 都要放队列里跑 你这个需求延时队列是最适合的方案
|
10
wuqingdzx 2019-04-22 09:49:59 +08:00
看你的提问,队列显然对你难度过高。
1.写个 php 脚本通过 supervisor 常驻后台( supervisor 相当容易) 2.写个 php 脚本加入 crontab 每分钟执行一次 以上都需要你把用户信息写入数据库。 web 服务 sleep 5min 早 down 掉本次 request 了 |
11
graetdk 2019-04-22 09:53:55 +08:00
把用户关注时间和付款否放在数据库里,然后写个脚本定时查询一下数据库,5 分钟前未付款的发一次通知即可,记得发完通知了标记一下状态
|
12
miao666 2019-04-22 09:55:14 +08:00 via iPhone
定时任务,每分钟执行一次判断代码。
|
13
Sor 2019-04-22 09:55:25 +08:00
如果你使用了 Laravel 框架 可以使用事件去处理这件事情,如果没有可以参考其中的实现思路,异步队列是最好的解决办法
|
14
loveCoding 2019-04-22 09:56:59 +08:00
不如存到数据库里面 , 比如 10s 刷一次任务.
|
15
sun019 2019-04-22 09:58:22 +08:00
计划任务或者队列
|
16
mscb 2019-04-22 09:58:56 +08:00 via Android
你或许可以设置一下你的服务器,实现 5S 响应而不超时,但是没法保证微信读的时候能请求的时候,5S 不判断为读超时啊。所以还是放到队列里,自己轮询主动推送消息吧。队列不会的话,用数据库也可以曲线救国
|
17
Vegetable 2019-04-22 09:59:09 +08:00
两个问题.
第一,睡眠 5 分钟会消耗大量的资源. 第二,公众号自动回复有超时,只有几秒钟.你不回复就会出现该公众号当前无法提供服务的提示给用户,会话会断掉. |
18
liujan 2019-04-22 10:01:12 +08:00
阿里云的 rocketMq 有延时消息,可以看下: https://help.aliyun.com/document_detail/43349.html?spm=a2c4g.11186623.6.549.771b208deSbos2
|
19
wengjin456123 2019-04-22 10:02:18 +08:00 via Android
使用队列去操作这个比较好吧
|
20
echoZero 2019-04-22 10:22:57 +08:00
延迟队列吧 beanstalk 延迟 5 分钟然后处理 可以不用存储到数据库
|
21
ferock 2019-04-22 10:26:20 +08:00 via iPhone
5 分钟以后给用户公众号里推送消息本身就不允许… 除非用户和你主动交互
|
22
keepeye 2019-04-22 10:28:08 +08:00
1. 你直接在请求中 sleep,等于这个请求一直无法结束直到超时。
2. php 是多进程处理请求,一个请求进来到结束过程中一直独占一个进程,那么很快所有进程都被 sleep 阻塞导致无法处理新的请求。 3. web 中不要用 sleep,你可以把这个用户 openid 随便记到文件、redis 或者数据库中,另外单独写一个脚本用 cli 模式去轮询处理,cli 下你随便 sleep |
23
phpcxy 2019-04-22 10:31:15 +08:00
延时队列,5 分钟后用客服消息接口发消息给用户。
|
24
ashin 2019-04-22 14:47:59 +08:00
队列复杂就用 crontab 扫啊
|