yanluya
V2EX  ›  PHP

PHP 异步通知(微信通知,短信通知,邮件通知)怎么做?如果全部等待返回结果会卡死

  •  2
     
  •   yanluya · Apr 2, 2019 · 8438 views
    This topic created in 2776 days ago, the information mentioned may be changed or developed.

    最近在做 php 客户订单通知的功能,加入了微信通知,短信通知,邮件通知。可是时间一长,客户提交订单很慢,而且有时候会请求超时,必须用异步通知来,大家有好的解决方法吗?

    37 replies  •  2019-04-14 16:49:04 +08:00
    blackjar
    blackjar
    Apr 2, 2019
    1
    队列
    zjsxwc
    zjsxwc
    Apr 2, 2019 via Android
    2
    单独跑个进程处理啊,最简单可以用 Jenkins 一个 jar 包搞定
    klgd
    klgd
    Apr 2, 2019
    3
    消息队列,我们现在就是把消息通知放到 rabbitmq 上发的
    rxzxf1993
    rxzxf1993
    Apr 2, 2019
    4
    swoole
    iSecret
    iSecret
    Apr 2, 2019
    5
    队列,通知一类耗时的任务全部丢到 redis 一类的介质里,后台搞个脚本去执行。
    fuxkcsdn
    fuxkcsdn
    Apr 2, 2019 via iPhone
    6
    标准答案上队列
    无脑方案,fastcgi_finish_request
    Moker
    Moker
    Apr 2, 2019
    7
    php-resque PHP 队列的一个实现 基于 Redis List 也可以自己实现
    Light3
    Light3
    Apr 2, 2019
    8
    队列 阿里云就有 其实就 redis 搞个队列 然后放进去 单独开一个进程 一直跑
    tomczhen
    tomczhen
    Apr 2, 2019 via Android
    9
    laravel queues
    RyanOne
    RyanOne
    Apr 2, 2019
    10
    简单一点的 fsockopen
    gabezhao
    gabezhao
    Apr 2, 2019
    11
    swoole
    phpcxy
    phpcxy
    Apr 2, 2019
    12
    队列
    xnode
    xnode
    Apr 2, 2019
    13
    简单 fsockopen 标准 队列 其他的 Guzzle
    yanluya
    yanluya
    OP
    Apr 2, 2019
    14
    队列应该是处理并发量大的订单和秒杀一类的商品比较好,像下单频率很低,有时一天才 2 单这样的,用队列会不会大材小用?
    chinvo
    chinvo
    Apr 2, 2019
    15
    laravel/think queue
    chengran630
    chengran630
    Apr 2, 2019
    16
    - -
    建一个表,然后定时执行,处理表中的通知,发送....
    简单 好维护,不需要其他的成本
    m939594960
    m939594960
    Apr 2, 2019
    17
    @yanluya #14 不会,耗时任务 php 不用 swoole 类的东西 只能用队列
    codebear01
    codebear01
    Apr 2, 2019
    18
    插到队列表,跑脚本处理
    yanluya
    yanluya
    OP
    Apr 2, 2019
    19
    php 没有异步程序吗?像 Java 那种开线程池,跑线程??
    xnode
    xnode
    Apr 2, 2019
    20
    @yanluya php 没有线程 只有异步函数
    jason56
    jason56
    Apr 2, 2019
    21
    swoole +1
    jadec0der
    jadec0der
    Apr 2, 2019
    22
    @yanluya 如果你一定想异步的话可以用 pcntl ( https://www.php.net/manual/en/book.pcntl.php) 开进程,但是这不是 php 的 best practice
    Felldeadbird
    Felldeadbird
    Apr 2, 2019
    23
    将通知拆分啊,然后交给前端去触发。这样就不怕延时了。
    qiyuey
    qiyuey
    Apr 2, 2019
    24
    MQ 啊
    sujin190
    sujin190
    Apr 2, 2019
    25
    另外弄个小发送服务呗,用 grpc、thrift 啥的弄个也很快了,几分钟就搞定,单量少,也就不需要考虑那么多了,加到 supervisor 进程管理里,很简单了

    或者更简单的,另外写个接口发送通知,再用 fscokopen 构造一个 http 请求,但是不等待返回就是了
    archersgz
    archersgz
    Apr 2, 2019
    26
    swoole
    1nakaELYBbsXbZxY
    1nakaELYBbsXbZxY
    Apr 2, 2019
    27
    队列,定时检查,超时重发
    dorothyREN
    dorothyREN
    Apr 2, 2019
    28
    那么这位老哥 短信接口要不要了解一下
    Dogergo
    Dogergo
    Apr 2, 2019
    29
    这种通知,当然一开始就要考虑异步吧,我们之前是 go 脚本+redis 队列搞的,一直跑
    xman99
    xman99
    Apr 2, 2019
    30
    其实不用那么高超的技术的

    把任务写入 redis,php 定时任务去消费就好。

    感觉这些都不能满足业务需求, 可以考虑下 入坑 swoole,swoole 坑不小。 如果考虑其他语言,go 是不错选择
    ducklyl
    ducklyl
    Apr 2, 2019
    31
    插到队列表,跑脚本处理
    askfilm
    askfilm
    Apr 2, 2019
    32
    感觉这些都不能满足业务需求, 可以考虑下 入坑 go,go 坑不小。 如果考虑其他方式,swoole 是不错选择
    askfilm
    askfilm
    Apr 2, 2019
    33
    说到底, swoole 坑不小到底是啥? :)
    jamblues
    jamblues
    Apr 2, 2019❤️1
    34
    扯语言,远了~

    容易且不靠 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 这种长时间保持连接
    以及业务大了以后的内存控制,锁,单例维护,扩展性和灵活性等等。
    qianbi6
    qianbi6
    Apr 11, 2019
    35
    我们用 swoole 发的。
    lhfdeamon
    lhfdeamon
    Apr 13, 2019 via Android
    36
    短连接了解一下
    qY3209HZitEb5Zty
    qY3209HZitEb5Zty
    Apr 14, 2019
    37
    给个 token 让前端异步去调用
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1909 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 83ms · UTC 07:41 · PVG 15:41 · LAX 23:41 · JFK 02:41
    ♥ Do have faith in what you're doing.