V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
squid157
V2EX  ›  问与答

从 PHP 迁移到什么平台比较合适?

  •  
  •   squid157 · 2015-10-06 18:20:56 +08:00 · 5129 次点击
    这是一个创建于 3366 天前的主题,其中的信息可能已经有所发展或是发生改变。

    下面的背景内容挺长的,希望大家能先粗略了解一下情况

    我现在在管一个学校内部的 Private Tracker ,负责维护。 Tracker 和周边的东西都是拿 PHP 写的,算是“祖传的”代码了。搞了一个夏天终于把它搞成 PHP 5.5 兼容了。至于再往后的版本,像兼容 PHP 7 需要把 mysql 砍了换 mysqli 或者 PDO ,我看并不是很现实,所以就没搞。

    现在想继续加功能,然而实在是无法忍受坑爹的世界第一语言了,因而明确认为需要换开发平台。不过,迁移要逐步完成,所以至少要保证两套程序都用一样的数据库和表结构——至少原有的数据要一样,对浏览器留下的 cookie 和用户验证方法也要一致……总归有不少限制。

    一方面迁移工作比较多,另一方面人手非常不够,可以看作只有一个人利用业余时间在搞(大学三年级,还好课不太多)。所以我非常在意迁移的方向,选了坑多的路就是自己在作死。

    现在考虑的方向有这么几个:

    • Python
    • C#/.NET
    • Java/JVM
    • PHP 7

    下面是纠结的东西:

    我不是专门学习软件工程 /CS 的,但是相对熟悉 Python (日常计算器,科学计算,抓网页),之前也拿 Django 写过一些简单的东西。然而我不确定 Python 的性能怎么样,因为我们服务器比较渣,而每天处理的请求数量大概有 200 万个,有朝一日全是 Python 后卡成傻逼,那我估计会被管理组的其他人拖出去枪毙个几分钟的。

    C#看起来不错,至少官方 IDE 挺爽的。但服务器是 Linux ,只能拿 Mono 跑,或者日后的 CoreCLR 。总觉得这样哪里有些奇怪,或者会被性能 /兼容性 /莫名其妙的 bug 坑死。另一方面 ASP.NET 这种东西似乎比 Django 的模式复杂一些,不过我刚看了一个小时不到,也不敢妄下结论。

    如果用 Java ,我个人不是很喜欢。看架势估计想撸出来什么有用的东西得猴年马月了。 Scala 或许不错,但也有很多人说有种种问题。而且,即使使用 JVM 上面的东西,我感觉大概率会用 Thrift 之类的东西通过 RPC 调用它,前端依然 PHP (不过看起来可能会好很多)。

    最后一个选项就是接着用 PHP ,慢慢地修老 bug ,重构,分离前后端逻辑,迁移到 PDO/mysqli 。然而首先是我觉得撸 PHP 并不会比撸 Java 更优雅,同时也不想强奸眼睛和大脑,而且似乎 PHP 7 的性能也就是呵呵。另一方面,这样做的话我的新东西会被(老代码的) GPL 污染,虽然原则上只在那个服务器部署并没有问题,但也是莫名其妙感觉蛋疼。 HHVM/Hack 不予考虑,尤其是服务器还是上古的 32 位 CentOS 5 。

    所以,如果要保证新旧程序共存并逐渐迁移,在人力极为有限的情况下,换成什么平台最合适?

    可以是上面那几个方案里面的一个,也可以提出其他的建议。在此提前说一句谢谢😊

    65 条回复    2015-10-07 21:44:54 +08:00
    ljbha007
        1
    ljbha007  
       2015-10-06 18:43:50 +08:00   ❤️ 1
    推荐 Python + flask 简单好用功能强大
    FFLY
        2
    FFLY  
       2015-10-06 18:45:53 +08:00   ❤️ 3
    首先你的出发点就有点奇怪,与其考虑 PHP7 那么遥远的事,不如考虑功能开发。至于性能,就更是杞人忧天了。你知道有多少大型 PT 是跑在 VPS 上的吗?校内 PT 这种用户量,还不到考虑性能的时候。如果说运行过程中有性能问题,第一查代码,代码没问题的情况下查服务器环境。我还真不相信,一个校内 PT 就能跑出 PHP 的性能,而且 PHP7 的性能目前综合各类信息来看,绝不是呵呵。
    zonghua
        3
    zonghua  
       2015-10-06 18:46:57 +08:00   ❤️ 1
    C#/.NET on Linux 与众不同。
    Felldeadbird
        4
    Felldeadbird  
       2015-10-06 18:52:14 +08:00 via iPhone   ❤️ 1
    php7 和 php5 区别不大,选 php 吧。根据大多数人的总结, web 主要瓶颈不是语言,而是 io ,数据库方面。
    chaucerling
        5
    chaucerling  
       2015-10-06 19:24:09 +08:00   ❤️ 1
    平均下来每秒 20 多,根本不用考虑性能
    squid157
        6
    squid157  
    OP
       2015-10-06 19:26:28 +08:00
    @Felldeadbird mysql 模块被消灭了。我个人不喜欢 PHP 。
    squid157
        7
    squid157  
    OP
       2015-10-06 19:28:26 +08:00
    @chaucerling 显然半夜三四点学校都熄灯了。不过确实,没错,请求数量并不恐怖。我自己是新手,并不了解这些。
    squid157
        8
    squid157  
    OP
       2015-10-06 19:29:11 +08:00
    @Felldeadbird 确实,不过还好,感觉 MySQL 基本都在读 cache
    squid157
        9
    squid157  
    OP
       2015-10-06 19:30:23 +08:00
    @zonghua 嗯,是与众不同,所以觉得并不合适。但 MS 在大推.NET 跨平台,估计也不是非常糟糕,但不知道还有谁那么玩过。我是不想去作死的。
    squid157
        10
    squid157  
    OP
       2015-10-06 19:41:22 +08:00
    @FFLY 我看 PHP 他们挺喜欢把旧版本作古的。 PHP5.4 前两天刚刚 end of life 。

    我也是刚刚接触服务器,所以不知道。但我看很多比较屌爆的服务,请求也是每秒几百——然而他们有负载均衡和集群。我也去 Google 了一阵子,但很多都是测试 HTTP 静态页面请求,也就是 Apache/Nginx 的性能。因此我也不知道我们的东西到底能扛多少,我也不敢真去测试它。反过来,上次 MySQL 处于某种问题被重启,因为内存里面没缓存,整个服务也卡了一阵子。

    换 PHP7 的话,一样是各种老旧代码需要重构,而想对 Python 我真的不喜欢 PHP 啊。

    不过既然都说性能不是问题,那我就拿 Python 去玩了。
    FFLY
        11
    FFLY  
       2015-10-06 19:46:43 +08:00   ❤️ 1
    @squid157 淡定,选自己喜欢的就好了,还有大把的老程序只能 PHP5.2 ONLY 呢!
    squid157
        12
    squid157  
    OP
       2015-10-06 20:05:14 +08:00
    @FFLY 我就是用了一阵子把老程序 5.2 改到 5.5 。看到 mysql 这个模块停止更新,到 7 里面移除,我就实在是没动力接着改了。感谢回答。
    Felldeadbird
        13
    Felldeadbird  
       2015-10-06 20:10:31 +08:00   ❤️ 1
    @squid157 mysql 扩展函数被消灭是必然的。这玩意对于新手来说,容易产生注入漏洞。 PHP 若还保留,只会成为下一个 ASP 。更换语言不是那么简单的事情。你切换成 PHP7 ,只需要自己封装一个 query 和 fetach_array 类库就行了。走 PDO 或者 mysqli 。基本零修改。 当然,你切换语言必须要考虑后人和现有的人,否则等你离开后,会被人骂的。
    Felldeadbird
        14
    Felldeadbird  
       2015-10-06 20:13:39 +08:00   ❤️ 1
    @squid157 他们抱着 5.4 已经很好了。网上一大推公司坚守着 PHP5.2 的 ecshop 系列程序。这才叫吐血。
    zts1993
        15
    zts1993  
       2015-10-06 20:32:57 +08:00   ❤️ 1
    Java 吧。。
    DennyDai
        16
    DennyDai  
       2015-10-06 20:35:37 +08:00   ❤️ 1
    Rails
    kn007
        17
    kn007  
       2015-10-06 20:36:59 +08:00   ❤️ 1
    php7 可以用 mysql 编译进去就行了。。。
    改成 mysqli 其实一点不麻烦
    kn007
        18
    kn007  
       2015-10-06 20:37:16 +08:00   ❤️ 1
    如果要换。。。我觉得 nodejs 。。不错
    orFish
        19
    orFish  
       2015-10-06 20:38:41 +08:00   ❤️ 1
    重构还不如重写了。。。用 djaongo 吧。。
    hahasong
        20
    hahasong  
       2015-10-06 20:45:43 +08:00   ❤️ 1
    用 php 重写吧, nexus php 那时候写 pt 那时候还没有流行 mvc , orm 模型这些东西,用 php 重写应该很快。结构清晰了,以后扩展维护起来就方便多了。期待开源
    iyaozhen
        21
    iyaozhen  
       2015-10-06 21:08:47 +08:00 via Android   ❤️ 1
    @squid157 我不明白纠结 MySQL 模块干嘛?只是有些缺陷默认去掉了,你要的话还是可以自己编译,换 MySQLi 也很简单。所以 mvc 架构还是比较重要。

    不过你已经决定用 Python 了还是用吧。
    wdlth
        22
    wdlth  
       2015-10-06 21:14:56 +08:00   ❤️ 1
    我认为你们还是先把 32 位的 CentOS 5 换掉吧……
    tinyhill
        23
    tinyhill  
       2015-10-06 21:19:15 +08:00   ❤️ 1
    说了半天没明白瓶颈在哪里?如果是这一点:“现在想继续加功能,然而实在是无法忍受坑爹的世界第一语言了,因而明确认为需要换开发平台。”那么我认为没有这个必要重构或迁移,你应该做的是解耦,把现有体系下的 API 开放给提供新功能的程序使用,把自己可控的新东西通过自己的想法实现,有更多的时间再考虑旧功能的迁移。

    PS :现在重构,以后交接到别人手上,还是会面临你现在面临的问题。所以我觉得问题的关键是功能解耦,先让自己的工作相对独立地完成。
    lavadore
        24
    lavadore  
       2015-10-06 21:30:55 +08:00   ❤️ 1
    你个人擅长什么就迁移到什么呗,只凭个人喜好选择的平台你是想给之后接手的人挖坑么?
    bdnet
        25
    bdnet  
       2015-10-06 21:56:15 +08:00   ❤️ 1
    清楚逻辑的情况下重写当然容易,但普遍还要保持旧系统运行,综合而言重构还是比重写更符合实际情况,更何况资源有限。
    squid157
        26
    squid157  
    OP
       2015-10-06 22:16:17 +08:00
    @hahasong 然而代码写的丑,并不敢拿出来。。。
    zsx
        27
    zsx  
       2015-10-06 22:17:23 +08:00   ❤️ 1
    @Felldeadbird PHP 5.2 =_= 我们这里开发早就想升到 5.3 以上了,但 5.4 都停止更新了,还是不能离开 5.2 ……因为网上就是一大票虚拟主机还在 PHP 5.2 ……

    mysql 那里,基本上全局替换 mysql 为 mysqli 再简单测试一下模块就行了。 PHP 7 的性能比 PHP 5.6 提升了非常多,你可以在自己个人电脑上部署测试一下。

    至于慢,得弄清楚你的代码到底瓶颈在哪一方面,到底是在 I/O ,还是在计算,还是在数据库,诸如此类。不要盲目去重写。
    gamexg
        28
    gamexg  
       2015-10-06 22:30:45 +08:00   ❤️ 1
    选择也就 python 、 php 两个吧?
    既然喜欢 python 那就上吧,不过重构的工作量很大,能坚持下来吗?
    squid157
        29
    squid157  
    OP
       2015-10-06 22:35:44 +08:00
    @iyaozhen

    我当然是想让他老老实实的 MVC 了,但祖传老代码不行,自己螳臂挡车一样。换也不止一个地方不兼容,将近 100k 行代码, 1 个人。。。
    squid157
        30
    squid157  
    OP
       2015-10-06 22:37:50 +08:00
    @wdlth 机房的老师让我进去换我就换。搞个 SSH 进去都是跑了大半年,最后还是找之前的学长要来的。
    Actrace
        31
    Actrace  
       2015-10-06 22:46:04 +08:00   ❤️ 1
    我认为只有用 C 才能代替世界第一伟大语言并且解除你对性能的烦恼。
    dubuqingfeng
        32
    dubuqingfeng  
       2015-10-06 22:48:12 +08:00 via Android   ❤️ 1
    tornado 和 mongodb ,目前正在入坑中,反正尝试一下新东西嘛。
    squid157
        33
    squid157  
    OP
       2015-10-06 22:48:59 +08:00
    @tinyhill

    我了解,所以也在做解耦合的工作,但实在是不想接着用 PHP 了。不喜欢 PHP 是因为真的遇到了挺多的坑,心情挺不好的。

    而且现在,以及可以预见的将来,基本只有我一个人(或者再拉来一个队友)做,所以调整也可以接受,我觉得。现在拿到的代码就没任何文档,也是泪流满面。。还好有之前的人可以联系

    新代码的文档写好了,架构设计好了,就不会那么坑了吧,我猜。。
    squid157
        34
    squid157  
    OP
       2015-10-06 22:50:51 +08:00
    @Actrace
    @zsx

    现在性能没什么问题,每次故障十有八九是 MySQL 出什么毛病了。但担心的是换别的之后出问题会被砍死。。。
    zsx
        35
    zsx  
       2015-10-06 22:55:17 +08:00   ❤️ 1
    @squid157 检查一下日志,直觉感觉上去是你 PHP 哪里有语句写的不好,触发了全表扫描……
    squid157
        36
    squid157  
    OP
       2015-10-06 22:57:25 +08:00
    @zsx 十个月没看见慢查询了,所以应该不是
    zsx
        37
    zsx  
       2015-10-06 23:00:02 +08:00   ❤️ 1
    @squid157 其实如果你用 Python / RoR / Nodejs 的话没准坑更多_(:з」∠)_PHP 因为是不同会话间互相隔离的,代码有些小毛病还可以忍受,反正一次会话完这玩意也没了……换上面的……嗯。

    至于数据库,研究一下 Redis 缓存一些频繁被查询的内容?数据库挂掉总有 Log 的,查查看到底什么原因比较合适。
    Actrace
        38
    Actrace  
       2015-10-06 23:02:47 +08:00   ❤️ 1
    爱折腾是绝症,我觉得吃什么药都不重要了.关键是没得救.
    死过几次后才会明白现在的美好.
    clippit
        39
    clippit  
       2015-10-06 23:09:53 +08:00   ❤️ 1
    建议还是使用 PHP 。 WhatCD 的 Gazelle 项目算是目前比较好的 PT 系统了吧,人家也是用 PHP 写的。
    其实用什么语言写都不重要, PT 的业务逻辑并不复杂,关键是看人,看团队的熟悉程度。
    squid157
        40
    squid157  
    OP
       2015-10-06 23:41:43 +08:00
    @zsx

    是,我考虑过这个问题了。 Python 比较熟悉所以还好。目前没慢查询, memcached 也在用。上次莫名其妙挂掉的时候我并不管事儿,我管事儿的那次是硬盘满了,所以也没啥特别的。
    squid157
        41
    squid157  
    OP
       2015-10-06 23:44:23 +08:00
    @clippit

    对我这种只会写最简单的东西的人,足够复杂了(毕竟我不做开发)。。。我不是做这个的,起初觉得很简单,越看发现事情越多。
    kslr
        42
    kslr  
       2015-10-07 00:32:57 +08:00   ❤️ 1
    @squid157 这样说,我不觉得你有能力设计出更好的结构,只会搞得一团糟,最后只能放弃,大部分重构都是这样的结束的,你最好想好了。
    usedname
        43
    usedname  
       2015-10-07 00:34:20 +08:00   ❤️ 1
    mysql 这个驱动必须被移除, pdo 才是王道,用 php 5.4 真的很幸福了,像楼上们说的用 5.2 的公司真的多了去了
    squid157
        44
    squid157  
    OP
       2015-10-07 00:54:30 +08:00 via iPhone
    @kslr 之前那个属于上古时期的设计,总觉得改了会比不改好,慢慢前进吧。感谢提醒。
    squid157
        45
    squid157  
    OP
       2015-10-07 00:56:00 +08:00 via iPhone
    @usedname
    然而散落在几百个.php 中拼接出来的 SQL 查询,并非一天能解决的。
    rainysia
        46
    rainysia  
       2015-10-07 01:53:10 +08:00   ❤️ 1
    web 应用迁移成 python 会哭死你.有些语言擅长某些特定领域是有原因的. python 做做爬虫, 数据分析不挺好的. php 随便找时下流行点儿的框架都可以秒 django 几条街了.
    倒是 tornado/flask 这些轻便的框架, 你重构又需要配太多.
    就像楼上说的, "我不觉得你有能力设计出更好的结构,只会搞得一团糟 ,最后只能放弃"

    简单的, 就直接改改兼容就好. mysql--->mysqli 不就是分分钟的事. 至于这么复杂?
    squid157
        47
    squid157  
    OP
       2015-10-07 02:09:47 +08:00
    @rainysia

    你要看到原来的代码,就觉得,不重构的话,迟早要散架。

    个人觉得确实有优劣,但按照我现在的构想,以及对语言 /框架的熟悉程度, PHP 可能确实不是最优的。

    不过还是感谢提醒。
    lavadore
        48
    lavadore  
       2015-10-07 02:14:57 +08:00   ❤️ 1
    @squid157 这种古董项目,不出问题别去碰它。以后的事也不是你来操心的吧,如果代码确实烂,重新写说不定都比迁移要简单很多
    squid157
        49
    squid157  
    OP
       2015-10-07 02:18:19 +08:00
    @lavadore 算是个人兴趣吧,不改变数据库结构的情况下,想要 rollback 也很容易。

    研究了一阵子,数据库设计大体没问题,觉得可以逐渐过渡。但现在的程序,就像那些给新手的 Tutorial 里面写的小例子一样,各种东西混杂在一起,只是一个页面就能写几千行的 php 文件,偶尔出了毛病 debug 起来都是十分痛苦的。
    ibcker
        50
    ibcker  
       2015-10-07 02:45:55 +08:00   ❤️ 1
    PHP 上个性能调试工具,看下哪里有问题··改改就好了···重写个啥子···
    movtoy
        51
    movtoy  
       2015-10-07 10:38:15 +08:00   ❤️ 1
    用什么不重要。。关键是哪个你拿手!或者相关人拿手!
    kslr
        52
    kslr  
       2015-10-07 10:51:53 +08:00   ❤️ 1
    Daddy
        53
    Daddy  
       2015-10-07 11:56:09 +08:00   ❤️ 1
    你就是:心太大,想太多。

    然后就是被所谓 PHP 的梗梗到了,自以为有了信仰,工具是拿来用的。
    Comdex
        54
    Comdex  
       2015-10-07 12:03:45 +08:00   ❤️ 1
    强力推荐用 Golang ,性能和开发效率两不误,部署也简单,一个二进制即可
    magicdawn
        55
    magicdawn  
       2015-10-07 12:07:30 +08:00   ❤️ 1
    node.js 可以试试~
    golang 也不错
    squid157
        56
    squid157  
    OP
       2015-10-07 13:10:14 +08:00
    @Daddy
    这代码我看了一年,确实蛋疼。

    而且 PHP 本身的坑也掉进去好多了,心情不愉快。
    msg7086
        57
    msg7086  
       2015-10-07 13:19:45 +08:00 via Android   ❤️ 1
    别考虑性能。
    别考虑 centos 。
    如果你没有能力写复杂的东西,就别想着重写或者迁移了。搞这个的,首先你要有架构师的能力。
    一天 2m 请求不算很多,拿个 vps 就能跑。我自己写的一个 public tracker 一天跑 15m 请求, i5 的机子 cpu 基本动都不动。
    ekousp
        58
    ekousp  
       2015-10-07 13:25:56 +08:00   ❤️ 1
    无需迁移。
    WildCat
        59
    WildCat  
       2015-10-07 13:29:39 +08:00   ❤️ 1
    100k 行代码你还是别重构了,有这精力能去干赚好几万块的私活了。

    学校内部项目还这么上心我也是醉了。

    哥们,一定要向钱看齐啊
    shiny
        60
    shiny  
       2015-10-07 14:22:15 +08:00   ❤️ 1
    如果你对 mysql 扩展如此依赖,说明你的代码有很大的问题。
    squid157
        61
    squid157  
    OP
       2015-10-07 14:51:41 +08:00
    @msg7086

    嗯,因为我刚接触,所以也是缺乏了解。
    squid157
        62
    squid157  
    OP
       2015-10-07 14:54:12 +08:00
    @shiny

    是,但之前的代码来自别的开源项目,当年代码估计就是那个风格吧。。每个能输出的 PHP 都自己连接数据库,然后一边输出页面一边进行查询, SQL 查询也是 escape 之后拼接起来的。正因为如此,才考虑如何让这个东西看起来更。。易于理解一些。
    07jfxiao
        63
    07jfxiao  
       2015-10-07 15:51:44 +08:00   ❤️ 1
    nodejs 也可以试试嘛。
    lyf
        64
    lyf  
       2015-10-07 16:03:05 +08:00   ❤️ 2
    推荐 elixir , phoenixframework ,性能+效率
    WildCat
        65
    WildCat  
       2015-10-07 21:44:54 +08:00
    @lyf 看了下,赞!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1722 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:27 · PVG 00:27 · LAX 08:27 · JFK 11:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.