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

有没有办法通过 PHP-FPM 跑 PHP 实现一个 socket server?

  •  
  •   mantianyu · 2014-02-26 15:34:39 +08:00 · 4688 次点击
    这是一个创建于 3917 天前的主题,其中的信息可能已经有所发展或是发生改变。
    nginx + php-fpm 的方式可以处理 http 请求, 但是就不能处理 socket 连接了.

    网上 php 写的 socket server 似乎都只能是在 cli 模式下运行. 这样虽然能够做为 socket server 来处理 socket 连接, 但是又不能处理 http 请求了.

    我需要同时能够接收 http 请求又能够接收 socket 连接的 php 解决方案. 我知道 php-fpm 是作为一个 deamon 跑在后台的, 能不能让 php-fpm 处理 socket 连接? php-fpm 只能作为一个 fastcgi 来用吗?

    不借助 python, 不用 nodejs 等这些自带 http 服务器的语言的话, 有没有可能实现?
    26 条回复    1970-01-01 08:00:00 +08:00
    yakczh
        1
    yakczh  
       2014-02-26 15:41:36 +08:00
    swoole
    zorceta
        2
    zorceta  
       2014-02-26 16:11:21 +08:00
    socket可以承载TCP/IP,HTTP基于TCP/IP。

    就这样。
    mantianyu
        3
    mantianyu  
    OP
       2014-02-26 16:32:52 +08:00
    @yakczh 多谢, 突然想起来以前见过这个项目
    itfanr
        4
    itfanr  
       2014-02-26 16:37:33 +08:00
    同时能够接收 http 请求又能够接收 socket 连接的 php 解决方案?http+socket?这个可以用在嵌入式上搞远程操作硬件码?
    yakczh
        5
    yakczh  
       2014-02-26 16:41:30 +08:00
    php-fpm不能跑,只能用cli跑,除非修改fastcgi协议 不过你可以用nginx代理ws请求到cli,前端只暴露nginx

    其实php做这个不如java,当然你可以用多进程来搞,然后再拉个memcache来共享信息
    yakczh
        6
    yakczh  
       2014-02-26 16:42:13 +08:00
    @itfanr 当然可以
    oott123
        7
    oott123  
       2014-02-26 16:46:02 +08:00 via Android
    …跑一个 fpm ,再跑一个 cli 不就好了…
    itfanr
        8
    itfanr  
       2014-02-26 16:49:31 +08:00
    @yakczh 又激起了我学习php的热情 另外,嵌入式跑GO语言也应该不错
    luckyduck
        9
    luckyduck  
       2014-02-26 16:53:02 +08:00
    1.你可以用telnet直接连接上php-fpm,这时候你并没有走HTTP协议,它就像一个socket server,但你也没法让它执行你的PHP脚本,因为它不知道你要执行哪一个,你们之间没有遵循某种协议。
    2.用php写的socket server,是可以处理http请求的,只不过这需要你自己来解析和响应,这就和python那些原理一样了。
    yakczh
        10
    yakczh  
       2014-02-26 16:54:26 +08:00
    @itfanr 直接go吧,socket王者 参看 http://www.techempower.com/benchmarks/
    itfanr
        11
    itfanr  
       2014-02-26 17:04:11 +08:00
    @yakczh 嗯 go学了一点,不多 谢谢 原来它的socket王者啊!
    mantianyu
        12
    mantianyu  
    OP
       2014-02-26 17:19:24 +08:00
    @itfanr 嵌入式设备上远程控制硬件为何还需要 http 呢? 只用 socket 不就可以满足了吗?

    @yakczh 修改 fastcgi 就不去折腾这个了, 暂时不想整 websocket, 项目时间不够了, 以前没整过, 就算学习成本低应该也来不及了. 目前用的是多进程的方案.

    顺便请教下, 你说的 php 不如 java 的意思是说 java 可以同时实现接受 http 和 socket 连接?
    我只了解 servlet, 它需要跑在 tomcat 这样的容器中, tomcat 之类的容器能接收 socket 连接然后交给 servlet 吗?
    solove
        13
    solove  
       2014-02-26 17:22:00 +08:00
    推荐个别人写的 。。github fork下 zphp 项目有实现
    mantianyu
        14
    mantianyu  
    OP
       2014-02-26 17:23:00 +08:00
    @oott123 现在可以说就是这么做的, 这不觉得这样又增加了一层进程间信息共享嘛


    @luckyduck
    1. 我刚刚疑惑的就是 php-fpm 是不是只理解 fastcgi 协议, 看来好像是的啊...
    yakczh
        15
    yakczh  
       2014-02-26 17:25:45 +08:00
    @mantianyu 晕 不如是性能, socket都支持,都能做,就象同样的活,两个人干,有的干得快,有的干得慢, servlet只是sun对java来实现http请求服务方面定的一堆规范,你也可以定义一个serverlit的规范,说不定比它这个更快更简单
    yakczh
        16
    yakczh  
       2014-02-26 17:34:33 +08:00
    这玩意儿就不要折腾php了,php是采用应用服务器和业务脚本分离的方案,相当于异构系统结合起来,应用服务器c常驻内存,处理连接, php脚本一次性筷子,用完就扔,而象java,python,ruby,node其他这么单一语言同时扮演应用服务器容器和业务处理方案来说,一步到位,只要在解析http协议的时候检测下upgrade头就可以了(ws),或者也可以用自己定义的数据包格式,正常的http请求头就处理完业务就断开连接,如果是自己定义的数据包格式,就保持连接,或者push数据
    mantianyu
        17
    mantianyu  
    OP
       2014-02-26 17:46:55 +08:00
    @yakczh 有道理.. 受教了..
    wwek
        18
    wwek  
       2014-02-26 18:18:53 +08:00
    楼上的说的很清楚了。
    php 的用 swoole 用cli模式。
    或者用golang
    itfanr
        19
    itfanr  
       2014-02-26 19:44:06 +08:00
    @mantianyu 直接用socket? 如果不在一个局域网内呢?
    pubby
        20
    pubby  
       2014-02-26 21:38:50 +08:00
    直接裸跑一个php进程好了,不要和php-fpm搞一起


    至于性能,看你具体干什么用途了。

    我在公司用php的socket做过很多性能要求不苛刻的东西。

    话说几年前我还见过一个网页在线客服服务商的后台服务整个一个php+socket写的。(就是那种网页上挂一个在线客服对话框那种东西)


    性能要求苛刻的,用node.js或者golang吧(从部署和升级的便利上来说更推荐golang,直接可执行程序一考完事)
    mantianyu
        21
    mantianyu  
    OP
       2014-02-26 22:21:37 +08:00
    @itfanr 不在一个区域网的话, 用 http 也做不到双向实时的通信啊, http 只是个请求 --- 响应模型, 仅用 http 要怎么进行远程控制?
    itfanr
        22
    itfanr  
       2014-02-26 23:05:21 +08:00
    @mantianyu 那你说路由器的远程下载怎么实现的?
    mantianyu
        23
    mantianyu  
    OP
       2014-02-26 23:30:28 +08:00
    @itfanr 原来你是这个意思, 那如此说来, socket 就不能实现远程控制吗? 谁说 socket 只能用在区域网了
    itfanr
        24
    itfanr  
       2014-02-27 09:38:01 +08:00
    @mantianyu 看来我理解片面了
    ybf1220
        25
    ybf1220  
       2014-02-27 09:45:20 +08:00
    php-fpm 可以作为多个 factcgi 用,只要在/etc/php-fpm.d/写入相应的配置文件(这是防止跨站的好方法,不多很少人用) ,我只知道 php-fpm 除了在端口上监听,还可以在 socket 上监听,listen = /tmp/fpm.sock 。这样 nginx 只要反代到 sock 路径就能解析 php
    pushy
        26
    pushy  
       2014-02-27 18:53:47 +08:00
    bash-3.2# php -S 127.0.0.1:80
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2807 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 08:35 · PVG 16:35 · LAX 00:35 · JFK 03:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.