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

2014-02-26 15:34:39 +08:00
 mantianyu
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 服务器的语言的话, 有没有可能实现?
4550 次点击
所在节点    程序员
26 条回复
yakczh
2014-02-26 15:41:36 +08:00
swoole
zorceta
2014-02-26 16:11:21 +08:00
socket可以承载TCP/IP,HTTP基于TCP/IP。

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

其实php做这个不如java,当然你可以用多进程来搞,然后再拉个memcache来共享信息
yakczh
2014-02-26 16:42:13 +08:00
@itfanr 当然可以
oott123
2014-02-26 16:46:02 +08:00
…跑一个 fpm ,再跑一个 cli 不就好了…
itfanr
2014-02-26 16:49:31 +08:00
@yakczh 又激起了我学习php的热情 另外,嵌入式跑GO语言也应该不错
luckyduck
2014-02-26 16:53:02 +08:00
1.你可以用telnet直接连接上php-fpm,这时候你并没有走HTTP协议,它就像一个socket server,但你也没法让它执行你的PHP脚本,因为它不知道你要执行哪一个,你们之间没有遵循某种协议。
2.用php写的socket server,是可以处理http请求的,只不过这需要你自己来解析和响应,这就和python那些原理一样了。
yakczh
2014-02-26 16:54:26 +08:00
@itfanr 直接go吧,socket王者 参看 http://www.techempower.com/benchmarks/
itfanr
2014-02-26 17:04:11 +08:00
@yakczh 嗯 go学了一点,不多 谢谢 原来它的socket王者啊!
mantianyu
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
2014-02-26 17:22:00 +08:00
推荐个别人写的 。。github fork下 zphp 项目有实现
mantianyu
2014-02-26 17:23:00 +08:00
@oott123 现在可以说就是这么做的, 这不觉得这样又增加了一层进程间信息共享嘛


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


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

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

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


性能要求苛刻的,用node.js或者golang吧(从部署和升级的便利上来说更推荐golang,直接可执行程序一考完事)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/101959

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX