PHP 项目重构计划,推荐 GO 还是 Node js? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
vus520
V2EX    问与答

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

  •  
  •   vus520 2016-05-16 11:02:41 +08:00 8246 次点击
    这是一个创建于 3437 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    第 1 条附言    2016-05-16 15:24:31 +08:00
    被哥几个喷得手都在颤抖。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    @vus520 hack 其实就是静态类型版的 PHP ,语法过渡超级平滑,据说 Facebook 内部全部已经把 php 迁移到 hack 了
    slowgen
        80
    slowgen  
       2016-05-16 22:23:14 +08:00
    如果觉得是 php 没有常驻内存的导致花时间在代码解析上的话,可以先试下 workerman/swoole/ReactPHP 这 3 个框架任选一个,以纯 php 的方式开个 http server,简单写个路由,去调用你的算法,压测下看性能
    JoostShao
        81
    JoostShao  
       2016-05-16 22:39:43 +08:00
    业务先理清楚,不理清楚,换再牛逼的语言也没啥用
    liyj144
        82
    liyj144  
       2016-05-16 23:07:07 +08:00
    复杂的地方 c++,或者 nginx+lua 替换。业务部分还是 php 。 done
    levon
        83
    levon  
       2016-05-16 23:26:14 +08:00
    重要的是做业务剥离,逐个重构,重构是个大工程,慎重
    bullettrain1433
        84
    bullettrain1433  
       2016-05-16 23:30:21 +08:00
    老实 java 吧
    julor
        85
    julor  
       2016-05-17 07:13:26 +08:00 via Android
    @plqws 你确定没有好的 ide ?除了单步调试,其他都不是问题!我是 webstorm 加插件,相当舒服
    zacard
        86
    zacard  
       2016-05-17 10:38:54 +08:00
    java 。其实我想说 Go ,但是本人 Go 刚刚开始接触,没有发言权。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4252 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 04:10 PVG 12:10 LAX 21:10 JFK 00:10
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86