vus520
V2EX  ›  问与答

PHP 项目重构计划,推荐 GO 还是 Node js?

  •  
  •   vus520 · May 16, 2016 · 9245 views
    This topic created in 3823 days ago, the information mentioned may be changed or developed.

    现在的项目是标准的 PHPStack ,目前进入项目稳定期,准备对项目前端进行重构。

    目标:高性能,高可用,可扩展

    目前团队只有 PHP 基础,核心业务的重构准备用其它语言实现。

    现在进入选择艰难,求推荐一个坑。

    Supplement 1  ·  May 16, 2016
    被哥几个喷得手都在颤抖。

    1 ,并不是头脑发热想用其它语言来玩玩,而是经过一些小的测试,换个一个语言或者架构以后, QPS 能提升 6 倍+,但用的是小众语言,想着未来维护比较麻烦,还不如团队就统一学习一个方向。

    2 ,也并不是一下要把所有的业务都替换完,而是一块一块的替换,即使出问题也可以快速替换回来。

    3 ,其实我也比较保守,团队一直用 php stack ,原因也和各位说的差不多, php 解决不了的,其它语言估计也够呛

    4 ,但项目规模大以后,肯定会考虑其它语言或者架构,其实我更多的想了解,大家在这方面选项时,主要考虑哪些因素?
    86 replies  •  2016-05-17 10:38:54 +08:00
    vibbow
    vibbow
    May 16, 2016 via Android
    1
    为什么 不考虑 一下 c# 呢……
    looyao
    looyao
    May 16, 2016❤️1
    2
    为何要重构呢,有什么性能瓶颈么?还是其他因素?
    hcymk2
    hcymk2
    May 16, 2016
    3
    只有 PHP 基础。。。。其实换语言也一样。
    yangqi
    yangqi
    May 16, 2016
    4
    只有 php 基础还想着用别的语言?闲的没事情做了,瞎折腾?
    Moker
    Moker
    May 16, 2016
    5
    重构前端?那还是直接 Node.js 吧
    chunzhenniandai
    chunzhenniandai
    May 16, 2016
    6
    不作死就不会死
    ohmycodeape
    ohmycodeape
    May 16, 2016
    7
    想好重构的出发点是什么,是否有除了重构外其他的方法,另外你这个应该叫重写 2333
    vus520
    vus520
    OP
    May 16, 2016
    8
    现在遇到性能瓶颈了,一个业务的后端机器有 8 台,未来扩展只能通过加机器来解决。
    目前压力都在缓存上,业务输出算是 CPU 密集型,加解密压缩之类的,想在这一层换成其它语言来解决。

    还有一块业务, php 中存在重复的计算周期,想通过内存共享来解决,减少重复计算。

    考虑用其它语言的原因
    1 , php 做了很久,业务也越来越复杂,也许其它语言有更好的方案
    2 ,有时间,团队可以学点新东西,团队里的人各自有一些不同的语言经验,但不统一,想挑一个统一的语言来一起学习
    vus520
    vus520
    OP
    May 16, 2016
    9
    @sun2920989 目的是能应付更高的请求,应付更高的平发
    ohmycodeape
    ohmycodeape
    May 16, 2016
    10
    @vus520 目的很明确,如果没有除了换语言重写外的其他方法,就做吧,CPU 密集的话 node 貌似不如 GO,无责任瞎说,最好多求证一下
    vus520
    vus520
    OP
    May 16, 2016
    11
    @sun2920989 个人比较看好 Node 或者说 js 未来的发展,顺道多积累点前端的开发,所以想入坑,不知道这样想是不是比较矫情
    ohmycodeape
    ohmycodeape
    May 16, 2016
    12
    @vus520 主要是我记得 CPU 密集型不是 Node 的强项,你再查查资料好了,我也不敢确定
    dofy
    dofy
    May 16, 2016
    13
    优化跟语言无关
    PHP 是最好的语言,没必要换。
    likezun
    likezun
    May 16, 2016
    14
    目前团队只有 PHP 基础,核心业务的重构准备用其它语言实现。 —— 这句就是第一个坑 , 后面有无数个。。。
    thinkif
    thinkif
    May 16, 2016
    15
    从实用的角度来说:挖掘一下现有 PHP 代码的潜力,而不是在一个只有 PHP 基础的团队推其他语言。
    stabc
    stabc
    May 16, 2016
    16
    nodejs 不适合复杂的业务逻辑。
    jedyu
    jedyu
    May 16, 2016❤️1
    17
    为什么不先尝试一下 PHP 扩展呢?
    kikyous
    kikyous
    May 16, 2016 via Android
    18
    比 facebook 复杂?
    sox
    sox
    May 16, 2016 via Android
    19
    你熟悉什么用什么😊
    plqws
    plqws
    May 16, 2016 via Android
    20
    Java
    doublleft
    doublleft
    May 16, 2016
    21
    看你们现在拿 php 来做什么了。
    像你说的场景可以做离线计算,访问分层处理。用 java 之类的重构成后端,把 php 只当作前端解析模板之类的。而且这样的话方便真对业务场景快速切换前端环境, node 还是 php 还是 go 想换就换。

    但不管换啥 不要把所有东西都压在一个上面,既处理请求,又操作数据库,又来做什么加解密的
    ipconfiger
    ipconfiger
    May 16, 2016
    22
    CPU 密集部分用 C++或者 C 写 PHP 的扩展模块嘛
    libotony
    libotony
    May 16, 2016
    23
    Node.js 不适合做 CPU 密集型的应用,我觉得你现在的问题要在架构上做优化,或者用 Node 做胶水层,后端用 PHP 或者其他计算能力更优的语言
    tabris17
    tabris17
    May 16, 2016
    24
    为了重构而重构?
    jhdxr
    jhdxr
    May 16, 2016
    25
    1. 不管用什么语言,你业务到了一定规模以后堆机器是必然的。架构上你要解决的是能够优雅地堆机器,而不是到了要堆机器的时候就换个语言。。。
    2. CPU 密集的确不是 PHP 的强项,但是是 C 的强项啊。。。最直接的想法不是 C 写个模块封装下 PHP 去调么
    3. 『目前团队只有 PHP 基础,核心业务的重构准备用其它语言实现』

    看了你的前一个帖子,我不觉得换一个语言就能解决压缩效率的问题。。。当然如果你只是想玩玩学习下别的语言就随意了。。。只不过拿核心业务这么玩_(:з」∠)_
    jhdxr
    jhdxr
    May 16, 2016
    26
    @tabris17 是为了重构而重写
    88250
    88250
    May 16, 2016
    27
    Go 的 Debug 可能是一个问题。如果团队的开发成员习惯以单步调式来 debug ,那就很难搞了。

    建议 Java ,成熟稳定框架多~
    finian
    finian
    May 16, 2016
    28
    取决于你们团队熟悉哪种语言,或者哪种语言容易招人(意味着有人 hold 得住),如果为了学习新语言而重构,纯粹是给团队挖坑。。。
    Felldeadbird
    Felldeadbird
    May 16, 2016
    29
    楼主这个换语言时解决不了问题的。指望更换开发语言来解决现有的业务问题,很容易被新语言的坑带来其他的业务问题。
    上面都说了,有些时候推硬件远比软件升级快得多。唯一缺点就是硬件的维护成本会巨大。
    strwei
    strwei
    May 16, 2016
    30
    laravel 大法好
    scys
    scys
    May 16, 2016
    31
    找人: Java
    实用: PHP
    计算密集: C
    mirrosite
    mirrosite
    May 16, 2016
    32
    用的什么框架?
    mirrosite
    mirrosite
    May 16, 2016
    33
    用 golang 还有点靠普,用 nodejs 重构了以后,我打赌你 100%要用 php 再重构回来
    msg7086
    msg7086
    May 16, 2016
    34
    8 台机器重构个毛……四五十台的时候你提重构我还能理解。
    8 台机器贵还是你们这些工程师贵?

    就算要优化,花点时间 profile 一下,把最慢的部分拿出来局部重写一下就行了。
    redvoilin
    redvoilin
    May 16, 2016
    35
    把需要密集计算的那块用性能更好的语言写下不就好了嘛
    iyaozhen
    iyaozhen
    May 16, 2016
    36
    还是要喷一下楼主的,你熟悉的语言都搞不定的复杂场景换个都不了解语言能搞定?这么自信?这和谁是最好的语言无关。

    「目前压力都在缓存上,业务输出算是 CPU 密集型,加解密压缩之类的,想在这一层换成其它语言来解决。 」
    缓存问题和语言没有关系吧。 CPU 密集型,这个 Node 也不行。 Go 倒是挺合适,但 C 扩展成本更低呀。不要想着一个语言解决所有问题。

    「还有一块业务, php 中存在重复的计算周期,想通过内存共享来解决,减少重复计算。 」这一块还是要用测试数据来说话,不要想当然, PHP 这样设计是有一定的好处的,比如内存泄露问题。话说业务上没有用 redis 吗? PHP 开启 OPcache 了吗?不考虑升级到 PHP7 ?
    picasso250
    picasso250
    May 16, 2016
    37
    我也是这个观点,将计算密集那块用 C 扩展。

    当然,如果那块的逻辑经常变,那就用 Go 吧。

    以上观点本人不负任何责任。
    JasperYanky
    JasperYanky
    May 16, 2016
    38
    典型的 XY 问题
    GG668v26Fd55CP5W
    GG668v26Fd55CP5W
    May 16, 2016 via iPhone
    39
    升级到 PHP7 了吗?
    wingoo
    wingoo
    May 16, 2016
    40
    lz 这样搞会掉坑里啊
    业务逻辑换什么语言, 该复杂还是复杂啊
    密集计算确实可以尝试切换, 但仅限于瓶颈的那块
    学习新东西, 这个不能摊派, 要看目前团队的水准, 为了学习而去更换, 只会比现在更头疼
    lbp0200
    lbp0200
    May 16, 2016
    41
    自己写 php 扩展啊
    xd314697475
    xd314697475
    May 16, 2016 via Android
    42
    shiny
    shiny
    PRO
    May 16, 2016
    43
    我赞同 @iyaozhen 的观点,因为自己也一路这么踩坑过来了。

    很多时候不是语言有问题,而是架构出了问题。(从你发帖的描述来看,应该是同样的状况)
    millken
    millken
    May 16, 2016 via Android
    44
    swoole 啊,楼🐷不差钱的话,我帮你重构。
    superleexpert
    superleexpert
    May 16, 2016
    45
    JAVA+1
    Comdex
    Comdex
    May 16, 2016
    46
    go,容易迁移
    plqws
    plqws
    May 16, 2016
    47
    团队只有 PHP 基础…这团队的确有些水了, Java 最合适不过,简单易学,前景良好。
    Node.js 一是遇到坑解决起来不方便,社区庞大,但是水分很大
    Golang 是 Native 语言,没有好用的 IDE , PHP 直接转过去的学习成本太高。
    至于 Java , IDE 丰富,社区庞大,文档齐全…说不出什么不适合之处了。
    vus520
    vus520
    OP
    May 16, 2016
    48
    @plqws 说得中肯,确实没想起要用 java

    我说的只有 php 基础,是指在生产中跑过集群,掌握集群架构运维。平时写点什么小脚本之类的,这不算掌握了语言。
    zaishanfeng
    zaishanfeng
    May 16, 2016 via Android
    49
    新功能可以试试新语言, 不建议 go node, 如果真要换想不到除了 java 还有哪个适合。
    7timesonenight
    7timesonenight
    May 16, 2016
    50
    从成本方面、对项目的普适性、团队基础几个方面考虑,还是 PHP 最适合吧。

    现在很多设计都是后端搭台,前端唱戏。既然现成的 PHP 团队,还不如学学前端,后台给完数据,在前端玩花样。

    现在玩前端, node.js 顺手就拿下了,到时候再根据实际需求,把适合转换的业务,迁移到 node 即可。
    agui2200
    agui2200
    May 16, 2016
    51
    讲道理,用 go,做个简单的组件测试评估一下,PHP 扩展那么好写?...我宁愿学 go
    audi
    audi
    May 16, 2016
    52
    目前进入项目稳定期,准备对项目前端进行重构
    。。。稳定了还要重构?
    vus520
    vus520
    OP
    May 16, 2016
    53
    @audi 重写重写
    audi
    audi
    May 16, 2016
    54
    @vus520 可能是目前团队太闲吧,找点事情做。
    surfire91
    surfire91
    May 16, 2016
    55
    饱暖思淫欲
    LBJames
    LBJames
    May 16, 2016
    56
    楼上那么多人说继续 PHP 就好的,我记得 Livid 说过一句话:现在已经是 2014(2015?)年了,已经没有必要再用 PHP 了。
    vus520
    vus520
    OP
    May 16, 2016
    57
    @audi 项目稳定的情况下,想学点新的东西,同时看看现在比较耗资源的地方能不能优化下,省点机器,感觉目标还是挺简单的
    audi
    audi
    May 16, 2016
    58
    @LBJames Livid 是神?
    chairuosen
    chairuosen
    May 16, 2016
    59
    如果选 node ,没有大牛的话, hold 不住。
    yxaaa123
    yxaaa123
    May 16, 2016
    60
    最近老听说要把 php 换 java 的。。。
    lualu2
    lualu2
    May 16, 2016
    61
    为了重构而重构...
    还不如对现有的模块重新分析,看看弱点是哪个优化下.或者对模块进行重构,方向是改的更适合和其他语言交互.这样以后新增的功能和模块或者弱项可以在将来用其他语言实现.对于老模块的整体重构,通常会越改越错....
    语言不能解决问题,每个语言都有每个语言的问题.专攻 php 如果初学其他语言,肯定会遇到坑,直接用在稳定的项目上,就是雷.所以还不如拿新语言在新项目和新模块练手,这样既熟悉了新语言,又对新老语言 /模块的交互有了更深的了解,对老模块的重构也是一种助益.
    surfire91
    surfire91
    May 16, 2016
    62
    @vus520
    针对楼主后面补充的第 4 点说下我的经验:
    项目大了之后最需要做的就是拆分与解耦。将大项目维持成多个比较较独立的小项目的合集。

    楼主提到目前的性能瓶颈只能通过加机器来解决,我倒反而觉得这是个很好的架构。横向可扩展的架构在扩展时的风险是非常小的。而如果只能重构 /重写来解决扩展问题都会有较大的风险。当然这与我遇到的业务相关,重构产生的一个小小的 bug 远不止几台机器的钱。

    楼主闲着想折腾的话推荐静态类型语言。
    gamexg
    gamexg
    May 16, 2016
    63
    @plqws 目前觉得 golang 用 IntelliJ IDEA 加插件已经很好用了,有 vs 写 c# 的感觉。目前唯一的缺点是还不支持单元测试时单步调试。
    veiz
    veiz
    May 16, 2016 via Android
    64
    业务拉出来遛遛,让大家看看有多复杂
    gamexg
    gamexg
    May 16, 2016
    65
    换语言会碰到新的坑...
    golang 最近 1 星期碰到了几个坑。
    一次 x86 下 int64 原子操作崩溃,提示不能对空指针操作,检查后发现是未进行内存对齐。这个是我的锅,没细看文档,但是错误提示能不能好些?
    windows 下获得本地时区是 "" ,用 "" 作为时区创建时间,时间变成了 UTC 时区,差了 8 个小时... github 提交后已经开始修复。
    golang 1.5 升 1.6 后, http 标准库偶尔报错,还未确定原因。
    raincious
    raincious
    May 16, 2016
    66
    @gamexg
    https://golang.org/pkg/sync/atomic/#pkg-note-BUG

    其实这个不是 Golang 的问题,而是 CPU 。

    楼主如果真心想换语言(这样开销太大了,不建议,很容易项目就被打垮或者挂了),可以先将整个项目服务化,比如用户登入服务拆出来、用户私信服务、密集运算服务等等拆出来,让这些服务之间用 RPC 与主项目进行通讯。之后慢慢用 Golang 或者 Rust 重新实现这样的服务。

    这样可以一点一点的将项目转换到新语言上,同时确保主要的项目一直保持可用。
    gamexg
    gamexg
    May 16, 2016
    67
    @raincious 后来看到了那个说明,不过当时很纳闷,错误提示不能操作 nil 。我检查了多遍,确认传递进去的不是空指针,最后到 github 搜索,发现有人报告过,回复是内存对齐问题,就有那个文档连接。主要是想吐槽下能不能使用更友好的错误提示,或者编译期检查。目前的错误提示误导人啊。
    vus520
    vus520
    OP
    May 16, 2016
    68
    那还是继续蒙头做 php 吧,哈哈
    vus520
    vus520
    OP
    May 16, 2016
    69
    @veiz 业务不算复杂
    场景是广告类业务,现在的数据都异步组织好,放在缓存里。
    api 请求的时候,就是从缓存里把数据拿出来,根据策略排序,做压缩做加密下发。
    组织的逻辑一台机器就够了,跑压缩加密的过程,却需要 8 台机器。

    后来用 lua+openresty 替换了 api 端的接口进行测试,效率有很多提升,感觉 php 没有内存常驻还是会有资源浪费。
    murmur
    murmur
    May 16, 2016
    70
    复杂系统 java 简单系统剥离一部分到 node.js 剩下保持 php
    codingpp
    codingpp
    May 16, 2016
    71
    node.js 不适合写业务,玩玩可以
    fyooo
    fyooo
    May 16, 2016 via Android
    72
    试试 hack 语言?
    vus520
    vus520
    OP
    May 16, 2016
    73
    @fyooo 小众语言就算了
    ;)
    julor
    julor
    May 16, 2016 via Android
    74
    用 golang 没商量,绝对好
    jhdxr
    jhdxr
    May 16, 2016
    75
    @vus520 hack 指的是 hacklang.org _(:з」∠)_ 是非死不可基于 PHP 去做的改进的一个语言。。。大部分语法与 PHP 一致
    lygmqkl
    lygmqkl
    May 16, 2016 via iPhone
    76
    就说一句 PHP 应该够用,你需要的只是一个优秀的架构师
    DSKcpp
    DSKcpp
    May 16, 2016
    77
    新浪微博也是 php 啊 我觉得不是语言的问题吧。。。
    rayyang88
    rayyang88
    May 16, 2016
    78
    absolutely golang
    fyooo
    fyooo
    May 16, 2016
    79
    @jhdxr 对头

    @vus520 hack 其实就是静态类型版的 PHP ,语法过渡超级平滑,据说 Facebook 内部全部已经把 php 迁移到 hack 了
    slowgen
    slowgen
    PRO
    May 16, 2016
    80
    如果觉得是 php 没有常驻内存的导致花时间在代码解析上的话,可以先试下 workerman/swoole/ReactPHP 这 3 个框架任选一个,以纯 php 的方式开个 http server,简单写个路由,去调用你的算法,压测下看性能
    JoostShao
    JoostShao
    May 16, 2016
    81
    业务先理清楚,不理清楚,换再牛逼的语言也没啥用
    liyj144
    liyj144
    May 16, 2016
    82
    复杂的地方 c++,或者 nginx+lua 替换。业务部分还是 php 。 done
    levon
    levon
    May 16, 2016
    83
    重要的是做业务剥离,逐个重构,重构是个大工程,慎重
    bullettrain1433
    bullettrain1433
    May 16, 2016
    84
    老实 java 吧
    julor
    julor
    May 17, 2016 via Android
    85
    @plqws 你确定没有好的 ide ?除了单步调试,其他都不是问题!我是 webstorm 加插件,相当舒服
    zacard
    zacard
    May 17, 2016
    86
    java 。其实我想说 Go ,但是本人 Go 刚刚开始接触,没有发言权。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3369 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 125ms · UTC 10:35 · PVG 18:35 · LAX 02:35 · JFK 05:35
    ♥ Do have faith in what you're doing.