首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
宝塔
V2EX  ›  PHP

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

  •  2
     
  •   yanluya · 230 天前 · 3612 次点击
    这是一个创建于 230 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    感觉这些都不能满足业务需求, 可以考虑下 入坑 swoole,swoole 坑不小。 如果考虑其他语言,go 是不错选择
        31
    ducklyl   230 天前
    插到队列表,跑脚本处理
        32
    askfilm   230 天前
    感觉这些都不能满足业务需求, 可以考虑下 入坑 go,go 坑不小。 如果考虑其他方式,swoole 是不错选择
        33
    askfilm   230 天前
    说到底, swoole 坑不小到底是啥? :)
        34
    jamblues   230 天前   ♥ 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   221 天前
    我们用 swoole 发的。
        36
    lhfdeamon   220 天前 via Android
    短连接了解一下
        37
    jjzhanhun   218 天前
    给个 token 让前端异步去调用
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2062 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 26ms · UTC 00:25 · PVG 08:25 · LAX 16:25 · JFK 19:25
    ♥ Do have faith in what you're doing.