讨论下 PHP 转 go 的水平

2023-12-08 11:05:54 +08:00
 v2li32
今天摸鱼又看到 php 性能不行的帖子,我是专业 phper,也能写 java,python,不爱写 go 是因为不喜欢 go 的语法。


不知道因为性能问题转 go 的人是否深入理解过 php.有没有了解到 php 的常驻模式下运行,了解到 select,epoll,然后在去得出结论 php 性能不行。

都是跑在 linux 下的编程语言,都在用 select,epoll,谁又能差谁很多,不晓得大多数 phper 有没有搞到这一步。

在回到开发效率上,php 真的是 web 语言开发效率第一。
orm ,一对多,多对多关联,起码是把 java 开发效率秒的车尾灯都看不到。


再说项目开发,项目大了,什么动态静态语言开发出来的都是屎山。

不是公司硬性规定,或者自己喜欢学一下 golang ,转 golang 是为了什么。。写 php 的应该都不会喜欢 golang 的写法。

以下 phper 转 go 先评价下自己的 php 评分。

会 curd 一个框架的评 a
...+多个框架基础的 redis 队列,自定义进程都能搞评 b
...+可以随意很快上手不了解的框架评 c,
...+可以随意点击框架/扩展包看个大概流程评 d,
...+了解 php 为什么跟 java 比性能不行,linux 下调试追踪,会多进程网络编程评 e,
...+能看懂部分 php 源码实现评 f.

所以你(phper)转 go 在 a,b,c,d,e,f 那个层次呢。
9815 次点击
所在节点    PHP
83 条回复
Kylinsun
2023-12-08 11:35:45 +08:00
大部分都是跟風
shermie
2023-12-08 11:37:05 +08:00
为什么你们写 php 的动不动就把 go 带上,go 并不是你性能的解决方案啊,它只是一门语言而已。php 很多业务场景 go 开发起来是无法胜任的,每个语言有适合自己的场景,以我的经验:

1.写 windows 程序,调用 win32 ,我选 c++
2.写网络服务或代理,我选 go
3.写小脚本,训练模型,我选 python
4.写网站,写接口,我选 php
6.写桌面程序,调用 COM ,我选 c#

其他的什么 lua 、js 就不提了,先把 php 写明白吧
kidlj
2023-12-08 11:37:33 +08:00
phper 为啥要对 Go 心存芥蒂呢?刚看到一个 Go 赋能 php 的开源项目:

https://github.com/dunglas/frankenphp
lifei6671
2023-12-08 11:40:53 +08:00
给你举个例子吧,我们公司有 TOB 和 TOC 两类业务,TOB 的是 PHP 开发,目前日活 3000 个用户,QPS 也就几百个,但是后端部署了 200+的 8C+16G 容器,还经常连接超时。而 TOC 的业务访问量日均十几亿,每天几万活跃用户,是 Go 开发,QPS 几千,后端只部署了 4C+8G 的容器 70 台。😂
brader
2023-12-08 11:44:51 +08:00
@lifei6671 那我只能说你们的 PHP 架构师不行,我在上家,PHP 项目 QPS 也是几百,K8S 节点只部署了 4 台 4C8G ,上面的节点还附带跑了一些 IM 、文档、定时任务服务器。
agdhole
2023-12-08 11:45:53 +08:00
asp 做 web 全方位胜出
lyxxxh2
2023-12-08 11:50:51 +08:00
@lifei6671
拿 tob 跟 toc 比不合适,
lyxxxh2
2023-12-08 11:51:12 +08:00
@lifei6671 拿 tob 跟 toc 比不合适,
v2li32
2023-12-08 12:02:24 +08:00
@shermie 因为到处都是 php 不行了,转 go/其他语言,只是举例 go(我的,标题应该是 php 转其他语言), 从社区大概看下搞 php 的水平。 没有引战或者其他什么的. 我在 append 下的。
insert000
2023-12-08 12:10:38 +08:00
目前还在开发 PHP ,但是公司已经开始往 Java 架构过度了 ,我们目前不是 PHP 不行,公司 80%挣钱的业务和大流量都是 PHP 开发的,峰值 tps 在 1 万+ ,30 多台机器 8c16g 。往 Java 过度,更多是因为面对金融行业和 toB ,甲方要求私有化或者对接必须统一语言体系。不转变业务萎缩会越来越厉害,更多是处于国内业务的妥协转型 Java 。
GooMS
2023-12-08 12:14:48 +08:00
因为性能而转 go 的场景目前还不存在,楼上那个 3000 用户就 200+节点的建议开除,污染环境。
lyxxxh2
2023-12-08 12:15:24 +08:00
@lifei6671
...不小心 ctrl+回车了 打微信回车符习惯了

我司也有 tob 和 toc 的, 都是 php
tob 几十 qps, toc 几百几千 qps 。
***
tob 之所以这么低,是因为我一堆 n+1 sql,问题在 mysql,就是我代码。

至于优化,不敢。 修复数据比修复 bug 麻烦多了。
***
collection(10 万条数据)->where('status','3') 3s
array_filter(fn($item) => $item['status'] === 3,10 万条数据) 100ms

对于小数据,collection 很方便。
对于数据大,只能转原生,毕竟可是 10 万个闭包。

而像 go, 想用 collection 这种? 自己 for 去吧,所以性能不需要担心。

至于双方语言的"痛点“分析,讲起了太麻烦了。
charlestang
2023-12-08 12:17:02 +08:00
我觉得 abcdef 都能做到,其实已经进入比较高的层次,语言对你来说,只是一个表现工具,很多时候只是个人喜好问题了。你根本就是用任何语言都能解决任何问题的。在没有特定约束的情况下,你肯定关注自己的喜好就行了。
当你是一个这么高级工程师的时候,你在团队里不可能只是做一个小兵,十有八九要带团队,带项目。而这时候,你不得不考虑各种因素,想方设法促进你项目的成功。比如说,团队,比如说环境等等,都是要考量的。
PHP 有高级用法,swoole 之类的,甚至可以自己用 c 写个扩展。但是你能得到一个什么样的 PHP 团队,是你需要考虑的,比如,你能得到一个人人都是 abcdef 的 PHP 团队么?
有的时候我们说 PHP 不行了,就是说,PHP 界人才凋零。因为,abcdef 的 PHP 在市场上不可得,多数都是 crud 水平的 PHP ,这时候,你需要的项目里正好有一些 Go 很适合的场景。一个 a 级 go 程序员能解决的问题,可能需要一个 abc 的 PHP ,这时候,你作为 Leader ,不得以,是需要考虑转 Go 的。简历数量和简历质量可能就是你的约束。
asasjajsajsd
2023-12-08 12:51:22 +08:00
个人觉得聊语言对立没啥用;
各有各的优缺点,自己习惯用的顺手就行;公司就听公司的话(毕竟是给钱的爸爸)
其次就是你成不成功其实大部分人是不关心你用的什么语言的;
先站稳市场能盈利再说吧,再烂的代码,能跑就行
而且说实话淘宝、jd 那种体量的代码也不会只用一种语言的;
属于庸人自扰的话题
自己好用就行,自己的小功能的话咔咔写完功能就行;公司就听公司的话
BBCCBB
2023-12-08 13:04:05 +08:00
ORM 框架一对多, 多对多. java 也有
lesismal
2023-12-08 13:32:57 +08:00
@lifei6671 #4

> 是 Go 开发,QPS 几千,后端只部署了 4C+8G 的容器 70 台。😂

我怎么感觉你这是在黑 go 。。。QPS 才几千就 70 台 4C+8G 。。。
这么多 4C+8G ,如果瓶颈,猜测是你们数据库、缓存等基础设施瓶颈,日志量大 io 慢,或者其他这些语言无关的架构、系统瓶颈。否则我怀疑应该是你们 golang 代码写得太渣了。。。

对比下 golang 本身的能力:
https://www.v2ex.com/t/945827
picone
2023-12-08 13:43:12 +08:00
我个人干过两家公司,很不幸都是帮忙做重构。一个是做 PHP 重构到 Go ,一个是 NodeJS 重构到 Go 。
首先说性能,PHP 性能是不行,第一家公司做的,亿级请求量,重构完后大概数百个 Pod 减少到 50 左右,节约了一半。但是你说他性能不行吧,其实也可以了,PHP 单实例( 1C )扛起 100+ QPS 。至于 Node 吧那是真拉胯,就暂且不提了。

总的来说,性能不会是你选语言的第一要义,他只能作为第二、第三条的优点。但是 PHP 没有强类型,array 乱传真的很让人烦恼。重构的时候经常踩这种坑,就是因为类型不明。业务量大了,团队大了,又或者业务历史久了(多个人接手过),这种业务都建议用强类型语言,不然真的很难维护下去。
lesismal
2023-12-08 13:54:21 +08:00
建议 OP 多想想吧,那么多大厂跟进 golang ,人家的 CTO 、技术管理层,哪个不是背景闪耀、身经百战,哪个不是血雨腥风海量业务里杀出来的?你以为这些技术领头羊们都是弱智都是吃素的嘛。。。

另一个侧面,阿里当年从 LAMP 转型,放弃 PHP 到 Java 的时候跟 golang 也没关系,如果 PHP 给力还需要还 Java 吗?

别说什么 PHP 现在性能也提升了,语言指令性能的提升并不是性能的全部,只是一部分,甚至只是一小部分。
能写同步代码的编程语言,HTTP 服务的性能瓶颈多数时候都是慢 IO 占用系统线程。
能写异步代码的编程语言,又要面对 callback hell ,比如传统的 c/c++,脚本里 nodejs 。
简单 CURD 你不需要 RPC 、不需要各种基础设施的慢 IO 操作、你的 API 通常也不是海量并发,这时候一切看上去都还很美好,因为你搞定了业务、性能指标也并不比其他语言差,开发效率贼高,心里贼爽。
但是,如果接口里需要这些同步代码进行慢 IO 操作、并且会导致直接阻塞了线程,又遇到海量业务场景高并发的时候,系统线程数量瓶颈、并发度有限、会导致几何级的响应性能降级、请求积压,这时候如果跟那些异步非阻塞语言相比( golang 这种同步代码但底层 runtime 实际上是异步非阻塞、不需要因为系统线程数量为 N 就只能并发处理 N 个请求,本质上也是异步非阻塞,但让用户可以写同步代码),差距就下来了。
所以别被那些语言指令性能的 benchmark 灌醉。

语言慢 IO 占用系统线程不只是 PHP ,Java 非 Netty ,或者 Java Netty+同步方式操作慢 IO 基础设施之类的,或者其他语言类似的方式,也同样有这些瓶颈。
lesismal
2023-12-08 14:06:23 +08:00
最近好几次看到有人说脚本语言 ORM 牛逼,强类型语言 ORM 垃圾。

保持清醒一点好吗?弱类型 ORM 当然轻松了,但是你失去的是编译期检查,失去的是强类型系统规范安全保障等一系列优势。
ORM 只是让你获得了舒适区,就像刷抖音,很舒服,你获得了一些东西:比如你不太需要去思考 sql 语句如何写出来。但是你同时也大大减少了对不同数据集合处理的思考。如果是大表大数据集合,往往都是性能相关、对业务性命攸关的。当你习惯了只要 ORM 能实现业务逻辑的时候,扪心自问、有能力配得上去做海量业务海量数据的业务吗?随便一个 API 里的 ORM 生成的 sql 就可能把数据库卡住导致大量业务请求失败!
按照金字塔模型,这种层次的 CURDer 是开发者的主力群体,任何一个人保持在这个水平层次上都没问题,因为并不是每个人都需要去对高并发高性能这件事情负责,多数商业场景,随便写写都可以搞定。但是,如果是自己安于停留在这个层次,就不要出来拿性能说事、标榜我 PHP 或者我 Java 或者我什么语言很强了。或者如果自己想提升自己的技术境界技术能力,就不要把着眼前这点脚本语言的简单性能测试或者什么来对比了,参考我上一条回复,咱也不吹谷歌 golang 团队那两外老爷子和其他年轻一代的众神、因为其他语言的作者团队们也都是众神,但各个大厂的技术管理层跟进什么放弃什么是很有参考价值的、因为他们直面的就是工程领域商业战场,他们可不是傻子。

PS:我自己写 golang ,我也仍然经常说 golang 性能怎么也无法赶上 c/cpp/rust ,因为我也写 c/cpp ,我淘空了心思优化 golang 也仍然赶不上 c/cpp
askfilm
2023-12-08 14:23:54 +08:00
国内真有那么多 "海量业务海量数据" 的公司吗 !? 大家的公司都这么厉害吗 ?

那样的公司怎么会局限一种编程方式呢?

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

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

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

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

© 2021 V2EX