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

PHP 页面如何正确地和消息队列通讯?

  •  
  •   enenaaa · 2018-01-23 14:50:38 +08:00 · 3143 次点击
    这是一个创建于 2256 天前的主题,其中的信息可能已经有所发展或是发生改变。

    非常驻进程的 php 页面,需要等待某个消息的返回。 让 fpm 一直等么。

    嗯,不太想用 ajax 轮询的方式。

    15 条回复    2018-01-24 14:10:40 +08:00
    killerv
        1
    killerv  
       2018-01-23 16:49:36 +08:00
    websocket ?
    NjcyNzMzNDQ3
        2
    NjcyNzMzNDQ3  
       2018-01-23 17:13:52 +08:00
    workerman 有现成的基于 websocket
    sszxcss
        3
    sszxcss  
       2018-01-23 17:17:36 +08:00
    workerman 或者 swoole
    b821025551b
        4
    b821025551b  
       2018-01-23 17:19:28 +08:00
    swoole 吧,貌似以后要官方集成了。
    gclove
        5
    gclove  
       2018-01-23 17:33:24 +08:00
    从道理上说,你不用守护进程还能怎么实现

    要实现这个必须要有守护进程,要么只能轮询

    你可以不用 PHP 实现
    enenaaa
        6
    enenaaa  
    OP
       2018-01-23 18:15:46 +08:00
    @gclove 有点好奇,非驻留进程的 php 页面怎么对接复杂的业务流程。

    比如百度搜索这样。前端 php 运行在 hhvm 内,要等待后端的完成消息, 看他没用 ajax, 不知道是否也是类似 workerman 的常驻机制。
    fcten
        7
    fcten  
       2018-01-23 18:27:06 +08:00
    指定一个回调地址,当消息返回时调用该地址即可。
    很多 web 端的异步处理,例如调用支付宝进行支付,都是这么做的。
    gclove
        8
    gclove  
       2018-01-23 18:32:07 +08:00
    @enenaaa 不太明白你说的

    你说展示搜索页面的 php 没用 ajax ?

    搜索界面在浏览器里, 肯定有通过 ajax 获取关键词推荐 和 结果啊

    另外 ajax 只是一种 http 下的一种交互方式,也有其它 RPC 的实现。 可以自己设计

    搜索服务提供者 肯定是 java 写的吧
    aksoft
        9
    aksoft  
       2018-01-24 09:18:34 +08:00
    golang 欢迎你
    enenaaa
        10
    enenaaa  
    OP
       2018-01-24 09:57:17 +08:00
    @gclove
    对链接 https://www.baidu.com/s?wd=%E6%B0%B4%E9%80%86
    抓包。 里面第一个 http 请求就返回搜索结果了的。 也就是说,浏览器对前端 php 的请求返回时,php 已经从“消息队列”里得到了业务后端的结果。这样的话,浏览器->php->业务后端->php->浏览器, 这个流程里 php 需要等待业务后端的消息。
    我好奇的就是它怎么等的?
    enenaaa
        11
    enenaaa  
    OP
       2018-01-24 09:57:28 +08:00
    @aksoft php 是最好的语言!
    gclove
        12
    gclove  
       2018-01-24 11:05:55 +08:00
    @enenaaa 你这个想法是不对的, 这个可以理解成普通的 url 传参请求。

    这里不需要消息队列,你可以理解成成 php 去请求别的 API 数据后输出结果的过程

    另外光学一种语言是不行的,大部分前端都会基本使用 php
    enenaaa
        13
    enenaaa  
    OP
       2018-01-24 11:14:19 +08:00
    @fcten 设定回调 uri 地址, 就不是在同一个 http 请求里完成的了。
    enenaaa
        14
    enenaaa  
    OP
       2018-01-24 11:16:04 +08:00
    @gclove 场景是一样的。php 去请求后端 api, 一样要等待呀。 问题是怎么等, 是异步的等, 还是同步的等。fpm 模式的执行方式, 同步等待的效率太低了。
    fcten
        15
    fcten  
       2018-01-24 14:10:40 +08:00
    @enenaaa
    什么需求一定要在一个 http 请求里完成?

    一个请求 + 懒得编码 -> 同步等待
    一个请求 + 异步 -> swoole
    多个请求 -> 回调地址

    原生的 php 不支持异步,你又嫌同步效率低,又要在一个 http 请求里完成,那就是无解...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5263 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 05:44 · PVG 13:44 · LAX 22:44 · JFK 01:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.