最近在做 php 客户订单通知的功能,加入了微信通知,短信通知,邮件通知。可是时间一长,客户提交订单很慢,而且有时候会请求超时,必须用异步通知来,大家有好的解决方法吗?
1
blackjar 2019-04-02 09:53:49 +08:00
队列
|
2
zjsxwc 2019-04-02 09:55:52 +08:00 via Android
单独跑个进程处理啊,最简单可以用 Jenkins 一个 jar 包搞定
|
3
klgd 2019-04-02 10:03:37 +08:00
消息队列,我们现在就是把消息通知放到 rabbitmq 上发的
|
4
rxzxf1993 2019-04-02 10:08:23 +08:00
swoole
|
5
iSecret 2019-04-02 10:10:21 +08:00
队列,通知一类耗时的任务全部丢到 redis 一类的介质里,后台搞个脚本去执行。
|
6
fuxkcsdn 2019-04-02 10:10:44 +08:00 via iPhone
标准答案上队列
无脑方案,fastcgi_finish_request |
7
Moker 2019-04-02 10:11:30 +08:00
php-resque PHP 队列的一个实现 基于 Redis List 也可以自己实现
|
8
Light3 2019-04-02 10:11:57 +08:00
队列 阿里云就有 其实就 redis 搞个队列 然后放进去 单独开一个进程 一直跑
|
9
tomczhen 2019-04-02 10:17:44 +08:00 via Android
laravel queues
|
10
RyanOne 2019-04-02 10:20:16 +08:00
简单一点的 fsockopen
|
11
gabezhao 2019-04-02 10:52:04 +08:00
swoole
|
12
phpcxy 2019-04-02 10:52:35 +08:00
队列
|
13
xnode 2019-04-02 11:00:31 +08:00
简单 fsockopen 标准 队列 其他的 Guzzle
|
14
yanluya OP 队列应该是处理并发量大的订单和秒杀一类的商品比较好,像下单频率很低,有时一天才 2 单这样的,用队列会不会大材小用?
|
15
chinvo 2019-04-02 11:10:50 +08:00
laravel/think queue
|
16
lcy630409 2019-04-02 11:17:44 +08:00
- -
建一个表,然后定时执行,处理表中的通知,发送.... 简单 好维护,不需要其他的成本 |
17
m939594960 2019-04-02 11:17:59 +08:00
@yanluya #14 不会,耗时任务 php 不用 swoole 类的东西 只能用队列
|
18
codebear01 2019-04-02 11:20:08 +08:00
插到队列表,跑脚本处理
|
19
yanluya OP php 没有异步程序吗?像 Java 那种开线程池,跑线程??
|
21
jason56 2019-04-02 11:34:32 +08:00
swoole +1
|
22
jadec0der 2019-04-02 11:46:35 +08:00
@yanluya 如果你一定想异步的话可以用 pcntl ( https://www.php.net/manual/en/book.pcntl.php) 开进程,但是这不是 php 的 best practice
|
23
Felldeadbird 2019-04-02 11:49:07 +08:00
将通知拆分啊,然后交给前端去触发。这样就不怕延时了。
|
24
qiyuey 2019-04-02 11:49:41 +08:00
MQ 啊
|
25
sujin190 2019-04-02 11:55:34 +08:00
另外弄个小发送服务呗,用 grpc、thrift 啥的弄个也很快了,几分钟就搞定,单量少,也就不需要考虑那么多了,加到 supervisor 进程管理里,很简单了
或者更简单的,另外写个接口发送通知,再用 fscokopen 构造一个 http 请求,但是不等待返回就是了 |
26
archersgz 2019-04-02 12:56:46 +08:00
swoole
|
27
mmixxia 2019-04-02 13:47:08 +08:00
队列,定时检查,超时重发
|
28
dorothyREN 2019-04-02 14:16:09 +08:00
那么这位老哥 短信接口要不要了解一下
|
29
Dogergo 2019-04-02 14:38:16 +08:00
这种通知,当然一开始就要考虑异步吧,我们之前是 go 脚本+redis 队列搞的,一直跑
|
30
xman99 2019-04-02 14:44:09 +08:00
其实不用那么高超的技术的
把任务写入 redis,php 定时任务去消费就好。 感觉这些都不能满足业务需求, 可以考虑下 入坑 swoole,swoole 坑不小。 如果考虑其他语言,go 是不错选择 |
31
ducklyl 2019-04-02 15:57:32 +08:00
插到队列表,跑脚本处理
|
32
askfilm 2019-04-02 16:50:06 +08:00
感觉这些都不能满足业务需求, 可以考虑下 入坑 go,go 坑不小。 如果考虑其他方式,swoole 是不错选择
|
33
askfilm 2019-04-02 16:50:55 +08:00
说到底, swoole 坑不小到底是啥? :)
|
34
jamblues 2019-04-02 23:27:10 +08:00 1
扯语言,远了~
容易且不靠 swoole 实现的方案 前台: task - push list - Redis 队列 后台: 启动 php 长驻进程,pop 原子操作,可以视任务开多个。 nohup php deamon.php > deamon.log & do { // redis 取任务 task.lpop(); // do task // 重载条件 or 中止条件 } while(true); 当然,这个方案也不是这么简单, 如果只是发个邮件简单的 http 请求够用了。 但如果要复杂的话, 还要考虑像 mysql redis 这种长时间保持连接 以及业务大了以后的内存控制,锁,单例维护,扩展性和灵活性等等。 |
35
qianbi6 2019-04-11 16:16:21 +08:00
我们用 swoole 发的。
|
36
lhfdeamon 2019-04-13 00:08:19 +08:00 via Android
短连接了解一下
|
37
qY3209HZitEb5Zty 2019-04-14 16:49:04 +08:00
给个 token 让前端异步去调用
|