从 PHP 迁移到什么平台比较合适? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
squid157
V2EX    问与答

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

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

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

    我现在在管一个学校内部的 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 9: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     Solana     3530 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 04:22 PVG 12:22 LAX 20:22 JFK 23:22
    Do have faith in what you're doing.
    ubao msn 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