V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
solaro
V2EX  ›  问与答

PHP 如何实现异步请求实时返回结果?

  •  
  •   solaro · 2020-07-24 01:02:37 +08:00 · 2512 次点击
    这是一个创建于 1583 天前的主题,其中的信息可能已经有所发展或是发生改变。
    场景如下:
    用户 A ------请求-----> API-1
    API-1 ------收到请求后,往队列里丢数据,让队列异步处理------>队列
    队列 ------CURL 请求 API-2 ----->返回结果

    现在的问题是:用户 A 本次请求希望能实时得到返回结果。那么问题来了:返回结果要怎么实时返回,就算结果返回,也是返回给队列(或者说先存储于 DB 中),那么用户 A 的当前这个没法收到实时数据,或者说直接在代码里 sleep 个 N 秒后再读取 DB ????
    12 条回复    2020-07-27 22:32:56 +08:00
    solaro
        1
    solaro  
    OP
       2020-07-24 01:03:55 +08:00
    目前用的 laravel
    有没有大佬碰到过这种场景。API-1 和 API-2 网件延迟在 500ms 左右
    solaro
        2
    solaro  
    OP
       2020-07-24 01:04:13 +08:00
    有没有其他方案可以解决的。或者 websocket 内存常驻????
    ooh
        3
    ooh  
       2020-07-24 01:27:55 +08:00
    扔队列里面异步处理成功回调通过长连接通知客户端
    还不如 api1 请求成功后,客户端定时查询处理结果,500ms 也转不了几下
    kaiki
        4
    kaiki  
       2020-07-24 01:43:24 +08:00   ❤️ 1
    想想扫码登录是怎么处理的呗,隔一段时间请求一下,直到有返回
    KasuganoSoras
        5
    KasuganoSoras  
       2020-07-24 06:20:48 +08:00   ❤️ 1
    给你个思路:
    客户端 -> WebSocket -> Swoole 服务端,然后 Swoole 再把用户请求转发给 API,并且转发的时候为这个请求打上一个 Tag,例如加个 Header,用于标注是哪一个 WebSocket 客户端发来的请求。API 处理完以后把消息返回给 Swoole,并且记得附带上刚刚请求来的 Tag,然后 Swoole 根据 Tag 寻找对应的 WebSocket 客户端,再把消息推回去。
    jugelizi
        6
    jugelizi  
       2020-07-24 07:03:22 +08:00 via iPhone
    典型的长轮询呀
    rming
        7
    rming  
       2020-07-24 07:44:42 +08:00 via iPhone
    不在乎 rps 的话,把队列改成同步执行
    LinsVert
        8
    LinsVert  
       2020-07-24 11:25:15 +08:00
    前端轮询就行了 同 4L 的扫码登陆;或者就同步执行,laravel 的话 就是 dispatchNow
    solaro
        9
    solaro  
    OP
       2020-07-27 22:31:40 +08:00
    @kaiki 請求沒有結束,而且請求是保持住的,并不是客戶端那種輪詢
    solaro
        10
    solaro  
    OP
       2020-07-27 22:32:03 +08:00
    @rming 同步執行,PHP 的進程一行會 timeout
    solaro
        11
    solaro  
    OP
       2020-07-27 22:32:24 +08:00
    @jugelizi 不是長輪詢吧,可能是長連接?
    solaro
        12
    solaro  
    OP
       2020-07-27 22:32:56 +08:00
    @KasuganoSoras 好像你的方案更靠譜些呢,我試試哈,謝謝
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1802 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 16:29 · PVG 00:29 · LAX 08:29 · JFK 11:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.