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

讨论下 PHP 转 go 的水平

  •  2
     
  •   v2li32 · 2023-12-08 11:05:54 +08:00 · 9855 次点击
    这是一个创建于 384 天前的主题,其中的信息可能已经有所发展或是发生改变。
    今天摸鱼又看到 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 那个层次呢。
    第 1 条附言  ·  2023-12-08 12:02:54 +08:00
    标题:讨论下 PHP 转 go 的水平 => 讨论下 PHP 转 其他语言 的水平
    第 2 条附言  ·  2023-12-08 15:54:42 +08:00
    楼层里大佬说的比较中肯。 恰饭吃,语言还真是没那么重要。能搞钱就行。
    下午这会我又开始改 java 项目了...
    但是看到写个破接口说 php 因为性能不行的真是不爽,还都是从 php 转其他语言的人说的。换个角度讲,这部分人转其他语言也好。。
    83 条回复    2023-12-13 14:03:50 +08:00
    Kylinsun
        1
    Kylinsun  
       2023-12-08 11:35:45 +08:00   ❤️ 3
    大部分都是跟風
    shermie
        2
    shermie  
       2023-12-08 11:37:05 +08:00   ❤️ 3
    为什么你们写 php 的动不动就把 go 带上,go 并不是你性能的解决方案啊,它只是一门语言而已。php 很多业务场景 go 开发起来是无法胜任的,每个语言有适合自己的场景,以我的经验:

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

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

    https://github.com/dunglas/frankenphp
    lifei6671
        4
    lifei6671  
       2023-12-08 11:40:53 +08:00   ❤️ 3
    给你举个例子吧,我们公司有 TOB 和 TOC 两类业务,TOB 的是 PHP 开发,目前日活 3000 个用户,QPS 也就几百个,但是后端部署了 200+的 8C+16G 容器,还经常连接超时。而 TOC 的业务访问量日均十几亿,每天几万活跃用户,是 Go 开发,QPS 几千,后端只部署了 4C+8G 的容器 70 台。😂
    brader
        5
    brader  
       2023-12-08 11:44:51 +08:00
    @lifei6671 那我只能说你们的 PHP 架构师不行,我在上家,PHP 项目 QPS 也是几百,K8S 节点只部署了 4 台 4C8G ,上面的节点还附带跑了一些 IM 、文档、定时任务服务器。
    agdhole
        6
    agdhole  
       2023-12-08 11:45:53 +08:00   ❤️ 2
    asp 做 web 全方位胜出
    lyxxxh2
        7
    lyxxxh2  
       2023-12-08 11:50:51 +08:00
    @lifei6671
    拿 tob 跟 toc 比不合适,
    lyxxxh2
        8
    lyxxxh2  
       2023-12-08 11:51:12 +08:00
    @lifei6671 拿 tob 跟 toc 比不合适,
    v2li32
        9
    v2li32  
    OP
       2023-12-08 12:02:24 +08:00
    @shermie 因为到处都是 php 不行了,转 go/其他语言,只是举例 go(我的,标题应该是 php 转其他语言), 从社区大概看下搞 php 的水平。 没有引战或者其他什么的. 我在 append 下的。
    insert000
        10
    insert000  
       2023-12-08 12:10:38 +08:00
    目前还在开发 PHP ,但是公司已经开始往 Java 架构过度了 ,我们目前不是 PHP 不行,公司 80%挣钱的业务和大流量都是 PHP 开发的,峰值 tps 在 1 万+ ,30 多台机器 8c16g 。往 Java 过度,更多是因为面对金融行业和 toB ,甲方要求私有化或者对接必须统一语言体系。不转变业务萎缩会越来越厉害,更多是处于国内业务的妥协转型 Java 。
    GooMS
        11
    GooMS  
       2023-12-08 12:14:48 +08:00
    因为性能而转 go 的场景目前还不存在,楼上那个 3000 用户就 200+节点的建议开除,污染环境。
    lyxxxh2
        12
    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
        13
    charlestang  
       2023-12-08 12:17:02 +08:00   ❤️ 5
    我觉得 abcdef 都能做到,其实已经进入比较高的层次,语言对你来说,只是一个表现工具,很多时候只是个人喜好问题了。你根本就是用任何语言都能解决任何问题的。在没有特定约束的情况下,你肯定关注自己的喜好就行了。
    当你是一个这么高级工程师的时候,你在团队里不可能只是做一个小兵,十有八九要带团队,带项目。而这时候,你不得不考虑各种因素,想方设法促进你项目的成功。比如说,团队,比如说环境等等,都是要考量的。
    PHP 有高级用法,swoole 之类的,甚至可以自己用 c 写个扩展。但是你能得到一个什么样的 PHP 团队,是你需要考虑的,比如,你能得到一个人人都是 abcdef 的 PHP 团队么?
    有的时候我们说 PHP 不行了,就是说,PHP 界人才凋零。因为,abcdef 的 PHP 在市场上不可得,多数都是 crud 水平的 PHP ,这时候,你需要的项目里正好有一些 Go 很适合的场景。一个 a 级 go 程序员能解决的问题,可能需要一个 abc 的 PHP ,这时候,你作为 Leader ,不得以,是需要考虑转 Go 的。简历数量和简历质量可能就是你的约束。
    asasjajsajsd
        14
    asasjajsajsd  
       2023-12-08 12:51:22 +08:00
    个人觉得聊语言对立没啥用;
    各有各的优缺点,自己习惯用的顺手就行;公司就听公司的话(毕竟是给钱的爸爸)
    其次就是你成不成功其实大部分人是不关心你用的什么语言的;
    先站稳市场能盈利再说吧,再烂的代码,能跑就行
    而且说实话淘宝、jd 那种体量的代码也不会只用一种语言的;
    属于庸人自扰的话题
    自己好用就行,自己的小功能的话咔咔写完功能就行;公司就听公司的话
    BBCCBB
        15
    BBCCBB  
       2023-12-08 13:04:05 +08:00
    ORM 框架一对多, 多对多. java 也有
    lesismal
        16
    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
        17
    picone  
       2023-12-08 13:43:12 +08:00
    我个人干过两家公司,很不幸都是帮忙做重构。一个是做 PHP 重构到 Go ,一个是 NodeJS 重构到 Go 。
    首先说性能,PHP 性能是不行,第一家公司做的,亿级请求量,重构完后大概数百个 Pod 减少到 50 左右,节约了一半。但是你说他性能不行吧,其实也可以了,PHP 单实例( 1C )扛起 100+ QPS 。至于 Node 吧那是真拉胯,就暂且不提了。

    总的来说,性能不会是你选语言的第一要义,他只能作为第二、第三条的优点。但是 PHP 没有强类型,array 乱传真的很让人烦恼。重构的时候经常踩这种坑,就是因为类型不明。业务量大了,团队大了,又或者业务历史久了(多个人接手过),这种业务都建议用强类型语言,不然真的很难维护下去。
    lesismal
        18
    lesismal  
       2023-12-08 13:54:21 +08:00   ❤️ 5
    建议 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
        19
    lesismal  
       2023-12-08 14:06:23 +08:00   ❤️ 3
    最近好几次看到有人说脚本语言 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
        20
    askfilm  
       2023-12-08 14:23:54 +08:00
    国内真有那么多 "海量业务海量数据" 的公司吗 !? 大家的公司都这么厉害吗 ?

    那样的公司怎么会局限一种编程方式呢?
    jowan
        21
    jowan  
       2023-12-08 14:33:47 +08:00
    CRUD NO CURD

    SpringCloud 全家桶 开发效率真比不上 PHP 吗 2023 年了 还秒的尾灯都看不到 离谱
    abcdexx
        22
    abcdexx  
       2023-12-08 14:42:01 +08:00
    orm ,一对多,多对多关联,起码是把 java 开发效率秒的车尾灯都看不到
    -------------------------------------------------------------------------------------------------
    go 里面用 gorm 做这些也很方便啊
    6jiayoung
        23
    6jiayoung  
       2023-12-08 14:44:09 +08:00
    go 工资比 php 高
    jowan
        24
    jowan  
       2023-12-08 14:50:28 +08:00   ❤️ 1
    PHP 门槛低入门快 是得益于他没有严格的数据类型约束
    无需静态编译 大部分情况不需要维护内存开销
    开发者没有额外的心理负担
    变量未释放就未释放 有溢出风险也无伤大雅
    一个 FPM 生命周期结束自然就没了
    业务迭代效率高 代码写起来 无需过度考虑
    虽然有不少人使用 Phalcon 、Swoole 这些 C 扩展的常驻内存框架
    但不可否认绝大部分 PHP 程序员 还在用 FPM 这套
    而 PHP 的优点也是他的弱点 起码在高并发的 FPM 模式下
    其他静态语言无需像它一样频繁地 fork 进程开销
    如果在相同水平的程序员用其他语言写出来的是屎山
    那么他用 PHP 写出来的必定是粪山
    为什么 因为你在做 codereview 时
    前面$data 是 array 在后面可能突然变成了 string 最后还可能是 int
    代码逻辑实现的不好 用什么语言都一样
    在 PHP 里面会更明显一点 讨论语言本身意义不大
    lifei6671
        25
    lifei6671  
       2023-12-08 14:51:48 +08:00
    @lesismal #16 70 台是运维要求部署的最低配置。实际上这些 pod 的负载很低。而对应的 PHP 复杂就很高了,CPU 都快 80%了。
    lifei6671
        26
    lifei6671  
       2023-12-08 14:52:58 +08:00
    @lyxxxh2 #12 没太看懂你说的什么意思,tob 和 toc 在代码上有不同吗???
    lifei6671
        27
    lifei6671  
       2023-12-08 14:53:46 +08:00
    @brader 我们是 PHP 转 go ,又不是从新招人,架构师和开发都是那一群人。。。
    lesismal
        28
    lesismal  
       2023-12-08 14:57:00 +08:00   ❤️ 1
    @lifei6671 #25

    你们的运维兄弟是懂怎么挣钱的。。。
    z1829909
        29
    z1829909  
       2023-12-08 14:59:49 +08:00   ❤️ 1
    再说项目开发,项目大了,什么动态静态语言开发出来的都是屎山。
    这句话很不认同
    php 的项目, 代码管理上稍微松懈一点, 从开始就屎了, 下限贼低. 如果想让项目慢点腐化, 对人员素质和维护的成本都有很大要求.
    go 最起码整体风格一致, 你的代码能跑起来, 就没有太多低级错误.

    而且转 go 真没几个是因为性能转, 大多是为了工作, 或者公司技术选型要求, 或者自己爱好. 你还整了个 abcd 评级, 别人愿意写哪个就写哪个, 为什么要去套你这套规则呢, 这个规则还是适合你自娱自乐用来约束自己玩吧.
    flyqie
        30
    flyqie  
       2023-12-08 15:00:03 +08:00 via Android
    `什么动态静态语言开发出来的都是屎山`

    楼主你开心就好,一个 array 走天下靠文档来维护,已经非常痛苦过了。

    现在 php 和 golang 都在用,确实得承认 php 在 web 上不错(swoole 、workerman 也用到过),我 cli 小工具也一直用 php 写,但 php 维护麻烦是客观存在的,不止 php 是这个问题,其他弱类型也是这个问题,php 推的强类型现在用起来还很麻烦,个人觉得算是树大难掉头。
    whyso
        31
    whyso  
       2023-12-08 15:05:47 +08:00
    @6jiayoung #23 绝杀!哈哈哈
    z1829909
        32
    z1829909  
       2023-12-08 15:09:03 +08:00
    我还是建议你不要这样企图去给别人下定义或者控制他人. 现实和你预期的不一样, 你会很痛苦.
    coderzhangsan
        33
    coderzhangsan  
       2023-12-08 15:10:45 +08:00   ❤️ 1
    我的看法如下

    1 为什么用 go:卷,面向工资编程
    go 语言创造之初,是想替代 c++,更应该去做系统层面服务,而国内用这个语言搞应用开发,尤其是 web 应用开发,有 java/php 生态完善的工具语言不用,非要打着性能大旗,重新造轮子,如果不为了这点工资,毫无意义,至于说什么节省了多少台机器,这些机器加起来才多少钱,开发人员成本才是大头吧,一个 go 程序员至少比 php 高出 3k 起,还租不起几台机器?高可用高性能的系统从来都是优秀的架构设计,语言只是锦上添花;以此推论,下一个应用语言风口是 rust 。

    2 phper 转 go 缺点
    绝大多数 phper ,主要工作都是在 web 应用项目,写接口或页面,高级网络编程及其原理,没几个熟练的,大概率转过去也还是写接口,从一门语言转向另一门语言,必然会将自己"母语"的开发思想和习惯带过去,写出的代码大多数不符合当前语言设计的。

    3 基础和逻辑思维很重要
    op 列出了 a-f 评分,php 这门语言,上手学习快,正因为如此,很多人不太重视基础知识的学习,对很多内置的库和函数研究不透彻,所以业务上偶尔出 bug ,不了解具体原因,就会用其他方式解决,譬如引进另一个工具;逻辑思维对任何一门语言都重要,不再乎你看了多少源码,如何结合业务实际高质量的代码,理解业务并做出契合业务的设计,这点很重要。
    yangzzz
        34
    yangzzz  
       2023-12-08 15:19:58 +08:00
    @6jiayoung 哈哈,还是这个老哥说的实在
    dobelee
        35
    dobelee  
       2023-12-08 15:22:27 +08:00
    别写这种无聊的引战帖子了,打份工而已非要分个高下。
    php oop 工程化基本都是走 Java 代码风格路线,跟 go 还真没法比。
    至于韩天峰搞的那些花活,说实话折腾起来挺累的,我建议直接用 go 。
    rm0gang0rf
        36
    rm0gang0rf  
       2023-12-08 15:27:13 +08:00
    在下一直 php, 没赶上过复杂业务或者大项目, 没遇到过高并发, 一天也就是 20-30g 的流量,别的参数也没算过...
    28Sv0ngQfIE7Yloe
        37
    28Sv0ngQfIE7Yloe  
       2023-12-08 15:33:49 +08:00
    >>> orm ,一对多,多对多关联,起码是把 java 开发效率秒的车尾灯都看不到。
    ------

    没写过 PHP ,是真的吗?
    jianchang512
        38
    jianchang512  
       2023-12-08 15:34:22 +08:00
    其实就是同样一堆烂代码的情况下,go 能跑的更好
    rm0gang0rf
        39
    rm0gang0rf  
       2023-12-08 15:36:04 +08:00
    @Morii 是真的
    whahuzhihao
        40
    whahuzhihao  
       2023-12-08 15:38:51 +08:00
    转语言主要还是就业市场的因素。但是根源上来看还是语言特性影响了 PHP 的使用范围,进而缩减了他的市场。
    参考 https://pphc.lvwenhan.com/part-two/bottleneck-of-programming-language/section-3
    PHP 的语言特性是单线程阻塞的,即使用 php-fpm 模式也改变不了这一特性。如果用 swoole 、workerman 这类常驻内存的框架,为啥不一步到位换成 go 呢。
    go 的语法虽然恶心,但是入门门槛也低。相比与转 java ,转 go 应该是 phper 最后的倔强吧
    monkeyWie
        41
    monkeyWie  
       2023-12-08 15:43:07 +08:00
    同样是脚本语言,写 php 还不如写 node.js
    xiaocaiji111
        42
    xiaocaiji111  
       2023-12-08 15:43:15 +08:00
    php 开发人员整体水平较低,当然不是说楼主,是以前面试得人员大部分这样,换门语言也够呛。大部分都是 yii 框架和 thinkphp 框架开发使用人员,从没接触过高并发项目。
    xuanbg
        43
    xuanbg  
       2023-12-08 15:43:29 +08:00
    对于不懂技术的人来说,PHP 确实性能不太行。一个接口要好几秒才能返回数据,知道的人晓得是写 PHP 的人不行,不知道的就只会说 PHP 不行。
    yekern
        44
    yekern  
       2023-12-08 15:48:37 +08:00
    看到你写的在 F, PHP 和 GO 都有在写.主要还是看主体业务有些场景比如后台没有什么请求,业务还不是很复杂 Laravel+Vue 写的飞起.
    在比如我司有业务需要处理几百兆的 PDF 账单文件要对账单文件进行分析提取数据入库并且分割 PDF 文件,这时候 PHP 的性能就有点捉急了. GO 很好的处理了这个任务.在有就是写一些简单的爬虫但是需要伪造浏览器指纹 PHP 也麻烦 Go 一个包就解决了.

    没有什么哪个好和不好的只有适合不适合.
    jonsmith
        45
    jonsmith  
       2023-12-08 15:49:37 +08:00
    语言是次要的,关键是生态,比如技术生态、人才市场的生态等。
    Nc
        46
    Nc  
       2023-12-08 15:50:28 +08:00
    不知道我这算不算转了, 原来搞 PHP 后来去搞 Python 爬虫和自动化那一块的业务, 后来公司 Go 项目组 缺人,又帮忙搞 Golang 的项目, 现在 接手 CRM 系统 又回到了 PHP5.6, Tp3.2 的时代. PHP 想换成 8.2 但是吧 里面的东西有点多. 不敢大的挖开,怕散架
    shermie
        47
    shermie  
       2023-12-08 16:28:01 +08:00
    @lesismal 不太认可你的说法 php 实现异步也不用回调啊 io 场景就是 php 的主场 有解决办法的
    JKeita
        48
    JKeita  
       2023-12-08 16:50:50 +08:00
    哪个合适用哪个,现在主要是 PHP 岗位少钱也少
    lidongyooo
        49
    lidongyooo  
       2023-12-08 16:55:51 +08:00
    @lifei6671 给你 QPS 算一千吧。1000/200=5 ,一台 8c+16g 的服务器就给 5 个人用就爆了?老子 2c+4g 每个接口都 N+1 ,性能都比你好。操了真想不明白。所以要么你在吹牛皮,要么内部有人恶意增加公司运营成本。
    joyanhui
        50
    joyanhui  
       2023-12-08 16:57:57 +08:00
    OP 认为都是 epoll 没差别,php 性能够用,甚至觉得 php 开发效率最高.....

    他能写 java python, 但是又说出 `起码是把 java 开发效率秒的车尾灯都看不到` 这句话。


    所以楼上的各位,我觉得,楼主不一定能理解你们在说什么。
    lesismal
        51
    lesismal  
       2023-12-08 17:14:23 +08:00
    @shermie #47

    我搜了下,PHP 也有协程,所以我猜你是指 PHP 协程?
    如果是这样,那我补充一点,除了 erlang 、golang ,多年前 lua 或者 c/cpp 也早就有协程或者库,但都是手动挡,比如 lua 的 yield resume ,我刚才搜的帖子里 PHP 的方式也是需要手动 yield 。
    近几年 js py 之类的也搞了 async await 这些。确实,整体看上去是同步代码、顺序可读了。但是,这种手动挡理解起来并不直观,对于步骤层次不多的,个人觉得手动挡协程甚至不如 callback 。
    nodejs 还有 Promise 这种,看上去是那个顺序,但并发的时序可能不是那个顺序,很多人因为这个写 bug 、或者理解吃力、或者要自己控制时序时非常麻烦。

    很多人可能没有深度使用 erlang 、golang 协程,或者已经习惯了那些手动挡的蹩脚协程,所以 get 不到 erlang 、golang 这种像线程一样的并发有多爽。

    Java 的虚拟线程还是啥也是类似协程,但似乎只是解决了语言指令级的调度,系统调用等行为并不会主动出让并可能因为阻塞占用了线程,我没有深入研究、不知道是否理解有误,但好像 Java 至少仍然需要解决大量的底层接口与虚拟线程调度结合的问题,这仍然需要很大的改造。

    再补充一些,现实业务不只是 CURD ,PHP 的编程姿势主要是为 Web 服务,一旦有复杂的需求,用 PHP 实现起来会很蹩脚、或者浪费资源,比如游戏

    #2 > php 很多业务场景 go 开发起来是无法胜任的

    所以我觉得,你这个可能把现象搞错了。现象是 PHP 有众多轮子,并且未必需要高性能或者什么,用 go 去重新做成本收益不划算。就像好些人说企业级只能 Java 一样,其实不是 golang 或者其他不能搞,而是因为 Java 已经形成了成熟的产业链和社区,并且企业级的业务 Java 性能各方面也足够胜任。用 golang 或者其他语言去重造需要很长时间,而现实商业场景,没哪家资本愿意去推动这个。但如果是新团队重新造这些,是可以用 golang 的。字节系大量业务用 golang ,飞书应该也用得挺多的,人家有钱有资源有人才,就是可以搞。
    除了极度性能场景是 c/cpp/rust 的天下,或者特殊专用领域,绝大部分的通用领域、绝大部分高并发高性能场景,golang 能搞、PHP 却未必能胜任。
    skwyl
        52
    skwyl  
       2023-12-08 17:16:42 +08:00
    只有适合不适合,php 曾经只有进程运行程序太伤了,但是现在的 8.x 总体上是好很多,支持更细粒度的协程,golang 本身是编译型语言,解释型跟编译型两种性能上差异肯定是明显的,这没啥好说的,我小项目喜欢用 php 方便快捷,处理一些性能要求高的就用 go 拆分服务
    tutusolo
        53
    tutusolo  
       2023-12-08 17:25:39 +08:00
    @jowan 放在外包公司的话,一个熟练的 php 顶 3 个熟练的 java 吧,秒的车尾灯都看不到只是委婉的说法,大概就相当于 php 都到终点了,java 才刚起步
    chenchengbin
        54
    chenchengbin  
       2023-12-08 17:32:17 +08:00
    编译型语言跑不过脚本语言那这个语言可以去死了
    baiyi
        55
    baiyi  
       2023-12-08 17:35:12 +08:00
    主要是生态,我要搞云原生,用 php 总是没那么顺畅的
    migu
        56
    migu  
       2023-12-08 17:57:16 +08:00
    @abcdexx #22 确实,虽然 JPA 框架做多对多这些场景方便,但当初刚用 JPA 的时候,头非常大,后面效率才起来
    ElmerZhang
        57
    ElmerZhang  
       2023-12-08 17:57:33 +08:00   ❤️ 5
    16 年 PHP 转 Java ,被当时的公司逼着转的。后来就是搞 Java 和 Node.js ,20 年逼着现公司从 Node.js 转了 golang 。
    离开 PHP 时水平勉强 f 吧。
    真正需要转语言来提升性能的,一般不会抱怨 PHP 性能不好,他们会说,我们遇到某某某问题,用 PHP 解决不了了,我们换 Java/Golang 吧。
    整天报怨 PHP 性能不好的人,绝大多数用 go 也写不出高性能的 API ,因为他们根本不知道到底性能差在哪里。
    99% 的性能问题都和语言无关。
    如果你觉得我说的不对,那说明你是那牛逼的绝少数,大神请受我一拜。
    glitterzhong
        58
    glitterzhong  
       2023-12-08 18:05:14 +08:00
    语言只有合适不合适
    fengfisher3
        59
    fengfisher3  
       2023-12-08 18:07:01 +08:00
    @lifei6671 你们运维真会赚钱。然后,你们这种垃圾架构,语言真不背锅。
    cexll
        60
    cexll  
       2023-12-08 18:15:20 +08:00
    2023 年以前,我是 phper 觉得 php 就是最牛逼的,虽然也在偷偷学 go ,但是更多是喜欢 go 的语法简单,不像 php 有 swoole swow workerman fiber 各种库 各种语法,php 也能高性能 swoole 安装上性能直接吊打一种静态语言,但是用到极致你会发现它就是不如原生就有的好用,2023 年以后 我学了 ruby rust react ts python 发现确实如最开始入门时 一些大佬说的,什么语言干什么事情,你先学一个入门,需要什么学什么,又不是脑子不够用,学啥不是学
    kuxuan
        61
    kuxuan  
       2023-12-08 21:34:50 +08:00 via Android
    我用 node 开发的,用户量小
    kuxuan
        62
    kuxuan  
       2023-12-08 21:38:22 +08:00 via Android
    不过对公司来说,多增加点服务器,带宽是不是很划算?
    happy32199
        63
    happy32199  
       2023-12-08 21:47:26 +08:00 via iPhone
    php 官方协程库 revolt.run ,正式版已经很久了 amphp 在用,各种协程库也齐全了。
    webman 性能也挺高,而且很容易就可以把老代码移植过去,没心理负担。都不比 go 差了。
    可惜出来得晚了,当年内斗,也出走很多人。
    james122333
        64
    james122333  
       2023-12-08 21:59:01 +08:00 via Android
    学 php 就是看官方文档即可 非常好用
    可以直接开 socket 并且多进程 也就是 workerman 在做的事 内建函数都很好 方便自己刻轮子 真要说缺陷就是也不迷你 与 java 一样代码可见 但这问题在 php 就不是那么严重了 毕竞方法很多
    老实讲用 java 如果不懂这些一样慢
    至于 go 内建的函数不是非常好 但一样是刻轮子用
    rekulas
        65
    rekulas  
       2023-12-08 22:04:40 +08:00
    我是 php/java 转 go 用着感觉很爽
    php 能实现的 go 都能实现,php 不能实现的很多 go 也能实现
    最基础的一点,go 直接解决了 php 的性能和常驻问题两个大问题,我个人非常在乎性能问题,当同样的接口转 go 后相应从几十毫秒下降到 1-3 毫秒,成就感无法替代,虽然也用过 phalcon swoole 等框架,但是说实话非常蹩脚,而且生态太脆弱了,实在难以继续
    还有个问题就是写 php 多了会越发觉得 php 底层的随心所欲, 历史坑太多

    我个人觉得 cli 运行的 php 才是真正的 php,如果 php 从诞生开始就专注于丰富 cli 生态(例如 webman 这样的框架早点出来受到认可大家都陆续丰富其生态), 说不定现在局面会好很多, 不过现在想这些也晚了
    maigebaoer
        66
    maigebaoer  
       2023-12-08 23:03:54 +08:00 via Android
    php ?有手就能写的东西,我不写了😡😡😡哈哈哈,这么说可以不🤣
    a132811
        67
    a132811  
       2023-12-08 23:34:20 +08:00
    开发效率只是一方面,有时需要关注以下问题:

    - 维护成本、重构效率,如何最大程度避免重构火葬场
    - 对底层内存的控制能力
    - 内存常驻时的泄漏风除
    - 类型隐式转换的风险
    - 底层 extension 开发的容易性
    - 底层库源码易读性、扩展性、调试性
    - benchmark/profile 分析的易用性、成熟度
    - 单测、功能测试的容易度

    以上是 php 做得不如 golang 的地方,应该不完整。如果不需要考虑这些问题,php 当然也可以用得很爽。

    BTW, php 相对 go 还有一个劣势:
    如果想成为 php 专家,需要看一下 c 维护调试下 c 扩展,付出的时间、走的弯路要比 golang 多,毕竟 golang 的源码精简、历史包袱屎山很少
    fkdtz
        68
    fkdtz  
       2023-12-08 23:57:02 +08:00
    @lifei6671 兄弟你这波数据,从用户量级到数据量级、再到服务端资源数量,怎么都感觉怪怪的,哪哪都不不上...
    kneo
        69
    kneo  
       2023-12-09 02:16:58 +08:00 via Android
    建议标题改成“讨论下 PHP 程序员的水平”。a
    simo
        70
    simo  
       2023-12-09 09:01:54 +08:00
    二楼正解,根据需要选语言,搞钱为目的。
    多学几门语言,至少熟悉之后,就明白语言就是工具之一,能让你在不同业务场景下做出自己能力范围内的最优解。php 转 go ,go 转 php 又如何,水平高低?啥用?自己几斤几两清楚明白就行了,别人说 php 不行,就不行了?说行,就行?
    大周末的,要继续搞不赚钱的破项目去了,你们水吧
    As1rkiv
        71
    As1rkiv  
       2023-12-09 09:36:49 +08:00   ❤️ 3
    先不谈数据,go 强类型确实极大的降低心智负担。
    本人 34 线小城市接外包,之前 js+node 一把梭,开发的时候是爽,写得快。
    不管前端传了什么东西,后端直接解构拿需要的字段,但是一旦代码量上了 3 万+,维护起来是真的要命。每个接口传了什么玩意儿都要测一遍再改。

    别说 node 上 ts ,我都 ts 了为啥不换个强类型的语言呢? 况且 node 要想利用多核,还得 cluster 。cluster 数据一致性又要上 redis 、mq 之类的玩意儿。框架上 nest 感觉比 spring 还恶心。
    rust 写后端性能是高,但是开发效率不太行,编译的又慢,而且那性能 99%的项目都用不到,杀鸡用牛刀。
    学 java 又搞不过那些写了好多年的老 java ,spring 又是一大坨要学;只能跟人屁股后面捡粑粑吃。

    选了 go 还是舒服的,语言层面能充分利用多核 cpu ;协程一个 go 关键字就完事; channel 也是真简单;写完编译成二进制,不怕甲方拿到源码,而且部署方便;各种微服务分布式容器化都有一堆资料,方便学习;恶心的点无非就是语法简陋,而且到处 if err != nil ;

    以单人外包的角度来看,前后端分离模式,又能写小程序又能写后台管理,掌握 vue+一门后端语言就能见到钱,搞 app 用 flutter ,还是一套后端; php 优势还是后端渲染写着爽,但是现在大多数需要 ssr 的场景也就是官网,其他 spa 完全能胜任;必须 ssr 的场景也完全可以用 nuxt 写 vue ,还是那一套东西,也不用多学啥;

    论 golang 框架,单体 gin 完全够用,洋葱路由那一套思想也是相通的;微服务 go-zero 、kratos ;服务网格 istio ;况且 docker 、k8s 都是优秀项目,可以阅读源码学习思想;个人是觉得在计算机里,思想比语言什么的要重要得多;

    go 就是一门干活的语言,简单粗暴解决各种工作上的问题,语法上不用深入研究,专注业务专注工程结构,有更多时间去学习优秀项目的思想;研究语法什么的还是得 c/c++、rust 之类的学术型语言;

    现在前端 ts+后端 go ,不用操什么咸蛋心;以前喜欢弱类型,现在写项目无比恶心弱类型;不过写爬虫之类的,弱类型还是香;

    要是想把项目牢牢抓自己手里,后端容器化微服务,nodejs 网关 + go 业务 + rust 计算 + mq 队列,甲方就被你套牢了😂
    newrefar
        72
    newrefar  
       2023-12-09 10:31:15 +08:00
    有没有可能因为你用 PHP ,所以你接触到的开发大部分都是网站+数据库
    yc8332
        73
    yc8332  
       2023-12-09 11:22:27 +08:00
    其实和语言真没太大关系。更多的可能是领导想改。。以前淘宝、微博也都是 php 写的接口
    soft101team
        74
    soft101team  
       2023-12-10 00:39:37 +08:00
    感觉又吵起来了
    shermie
        75
    shermie  
       2023-12-11 09:14:30 +08:00
    @lesismal php 的哪个 yield 我几乎不用 我说的是 swoole workerman 这类框架 我工作中几乎都是用的 swoole 所以更多的瓶颈都给到了存储这一层 同一种语言 不同的人写出来都不一样
    lifei6671
        76
    lifei6671  
       2023-12-11 09:49:05 +08:00
    @shermie #75 你觉得大厂会用这种框架???尤其是 swoole 这种吃相难看的,哪个大厂会用?
    shermie
        77
    shermie  
       2023-12-11 16:13:36 +08:00
    @lifei6671 这个和大厂不大厂没有关系 不是说大厂用了 php 那这门语言就如何好 更何况大厂都不怎么用 php 跟 swoole 的吃相也没有关系 而在于你自己是不是有解决方案 会不会用,你学编程的初衷是为了未来给大厂打工吗 不能吧
    lifei6671
        78
    lifei6671  
       2023-12-11 16:40:42 +08:00
    @shermie #77 有很大关系,大厂的技术栈首先考虑的不是能不能解决问题,而是安全性和业界活跃度。如果你在大厂待过就知道 swoole 绝对不会是大厂技术栈的首选,哪怕他吹嘘的性能再好。除非是他合入了官方的 PHP 仓库。
    lesismal
        79
    lesismal  
       2023-12-11 23:22:12 +08:00
    @shermie #75

    还有一个问题,你说的这个 PHP 协程,不管需不需要 yield ,会不会在使用系统调用、其他慢 IO 时阻塞了,因为已有的很多系统调用、慢 IO ,比如网络 IO 、操作数据库,如果这些底层接口并没有自动出让线程,那跟我前面提到的 Java 虚拟线程可能会是类似的问题。当你处理这些的时候如果阻塞了、线程就在那等待了,不能充分利用 CPU 、不是协程那种真的并发。我只是猜测、我并不了解你说的这个 PHP 协程哈
    coderzhangsan
        80
    coderzhangsan  
       2023-12-12 19:47:15 +08:00
    @newrefar php 是怎么诞生的,不就是做 web 起家的吗,所以 php 开发肯定是 web 相关的呀,我觉得有些人搞不清楚各语言的用途和优缺点,总是想着一门语言解决所有问题,更何况 php 还是个动态脚本语言,你不能总拿它她的弱点说事,你得学会分析什么工具做什么事,架构就是这些工具组合设计。
    guanhui07
        81
    guanhui07  
       2023-12-12 21:04:14 +08:00
    @lesismal 他说的 php 是韩天峰造的 swoole 确实和 golang 没什么不同了 ,常驻内存,同时支持协程,同步的写法,异步的执行,异步非阻塞的 swoole4 确实和 golang 差不多,swoole 确实是好东西 ,但是 php 官方也不认 ,php 官方只认 php-fpm fastcgi 同步阻塞 。
    lesismal
        82
    lesismal  
       2023-12-13 11:21:56 +08:00
    @guanhui07 #81

    看了下,看样子 swoole 确实是框架内置了一些驱动已经与协程结合起来了,例如 mysql 、redis ,确实很不错。
    但这毕竟仍然是框架级的,也就是说,必须得 swoole 框架支持慢 IO 操作才能真正实现同步代码底层非阻塞+自动调度。三方的东西很多,如果需要依赖一些 swoole 尚未支持的,则仍然是可能阻塞的。
    golang 是语言级支持了这些,三方的 golang 驱动实现基于 golang 标准库即可获得同步代码底层非阻塞+自动调度。

    所以也不能完全说“没什么不同”
    lesismal
        83
    lesismal  
       2023-12-13 14:03:50 +08:00
    @guanhui07 除了 #82 里说的,其他还有很多,go 并发编程里随便弄些协程做常驻任务运行,还可以方便结合 chan 、mutex 之类的实现各种功能,我搜的 swoole 例子里主要是 http handler 处理 http 请求这种,更广泛的业务场景怕是差距更大,不只是简单的无状态接口这个地方的协程的便利性
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1031 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 20:57 · PVG 04:57 · LAX 12:57 · JFK 15:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.