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

在国内使用 laravel 开发的公司多吗,这么优美的框架开发起来是不是很舒服?

  •  
  •   hellowwo · 2017-04-28 16:23:16 +08:00 · 27016 次点击
    这是一个创建于 955 天前的主题,其中的信息可能已经有所发展或是发生改变。
    150 回复  |  直到 2019-08-18 16:11:02 +08:00
    1  2  
        101
    ovear   2017-04-30 17:04:26 +08:00
    @sagaxu
    这不是我说的啊,作者表示我很为难啊,到底是哪国人了
    https://www.v2ex.com/t/342074
    https://www.v2ex.com/t/250863
    https://www.zhihu.com/people/evanyou

    尤雨溪不会搞艺术的程序员不是好设计师
    居住地
    现居新泽西
    所在行业
    互联网
    职业经历
    Vue.js · Chief Procrastination Officer
    Meteor · Core Dev
    谷歌 (Google) · Creative Technologist
    教育经历
    Parsons School of Design · MFADT
    柯蓋德大學( Colgate University ) · Art & Art History
    个人简介
    http://evanyou.me
    https://github.com/yyx990803
    http://vuejs.org


    另外你举例的问题是页面太狭窄了,打个比方,日本流行游戏制作框架 http://www.nscripter.com/
    https://onscripter.osdn.jp/
    都是很少英文的,有也只是一部分,但是他就是成功了呀。
    人家日本可以用国产,怎么到我国来就是不使用英语作为第一语言的就一定不成功了。
    真是奇了怪了,又是外国的月亮更圆的论调?
        102
    zencoding   2017-04-30 17:10:08 +08:00
    开发时顺的一 B,压测时慢的一 B
        103
    lianxiaoyi   2017-04-30 17:23:03 +08:00 via Android   ♥ 1
    曾经因为这个框架离职一家公司,这个框架封装的太狠,性能又差,你框架再怎么优雅,里面写的一团糟,也是垃圾!后来听里面同事说,4 台 8 核机器扛不起每秒 1000 人访问,然后准备通宵改原生!
        104
    msg7086   2017-04-30 17:28:39 +08:00
    @lianxiaoyi 8 核……就算是前几代的双路 x5650 也有 12 核了。
    双路 x5650 的成本算 500 刀一台,就算上 10 台也就 5000 刀,差不多是 1-2 个工程师的月薪而已。
    只有在工程师月薪惨不忍睹的情况下才值得花钱去改原生。
        105
    sagaxu   2017-04-30 18:19:54 +08:00
    @ovear
    vue 作者是复旦附中毕业的,大学才去的美国,就成美国人了?

    点开一看首页还是英语多于日语,https://onscripter.osdn.jp/onscripter.html,而且这个并不能算主流游戏引擎,英文文档不好,是出不了日本国门的。跟 ruby 相比,恐怕你举的例子,流行程度接近于零了吧。

    IT 发源地是美国,前沿技术和概念也大都来自美国,不用英语,等于主动把自己排除在最大最强的社区之外了。
    如果 linus 当年用芬兰语,C++,C#和 PHP 之父都用丹麦语,python 之父用荷兰语,可能都要无人问津了。

    不是哪国月亮圆的问题,IT 技术的东西,英语圈就是绝对垄断了,日语圈不行,德语圈也不行,法语圈也不行,汉语圈当然也一样不行。把自主和国产拿出来说事的时候,已经是玻璃心和深深的自卑感了。
        106
    bianhua   2017-04-30 18:24:51 +08:00
    @msg7086 你要开始这么比了,那就进怪圈了。

    @lianxiaoyi 我倒想知道是什么情况导致了性能如此之慢。比如是否运行在生产模式,以及是否开启了 OpCache。
        107
    printempw   2017-04-30 18:26:05 +08:00
    嫌臃肿的,性能敏感的项目就不要用嘛……用 Slim 呀 Lumen 之类的微框架不就好了
    用 Laravel 的话,开发速度肯定要比微框架 /原生快得多(当然你写个 Hello World 之类屁大点玩意肯定是感受不到的),而且性能问题可以堆钱解决啊 :D 没钱又要高并发,参见上一句

    我用于练习 PHP 而写的一个项目( printempw/blessing-skin-server ),从 1.0 时代(原生 PHP )到 2.0 时代(模型控制器分离,初有框架雏形)到 3.0 (自己写的 MVC 框架)到 3.1 ( Laravel ),过程中学到了很多。对于业务逻辑有一定程度的项目,Laravel 可以显著提升开发速度。我在这个项目前期摸爬滚打搞出来的一些东西,最后发现 Laravel 里全都有 :)

    不过我还是不推荐 PHP 新手直接上手 Laravel,只会一个框架却完全不了解框架的内核,不好。
        108
    printempw   2017-04-30 18:31:03 +08:00
    Laravel 臃肿的封装、缓慢的运行速度都是广受诟病的(也有 Laravel-Stone 之类的 solution ),不过其多层封装带来的好处,在业务逻辑复杂到一定程度后就会凸显出来。上面有些人吐槽「写个 Hello World 调用栈都有 70 多层」的人就是这样 :P

    业务逻辑很简单的话,就不要用 Laravel 这样的全栈框架了。感受不到 Laravel 带来快捷开发的爽快感,你只会得出「垃圾框架,臃肿性能慢,优雅个 P 」这样的结论 ;)
        109
    lucky215   2017-04-30 18:34:48 +08:00
    我感觉好多人都跑题了,laravel 在 PHP 社区里的确是个很好的框架,和 springboot 其实没什么可比性,语言就不一样啊
        110
    sagaxu   2017-04-30 18:39:49 +08:00
    @lianxiaoyi

    laravel 是慢,但也没有慢到连 1000rps 都扛不住,laravel 之父亲自做过 benchmark
    https://medium.com/@taylorotwell/benchmarking-laravel-symfony-zend-2c01c2b270f8

    2G 内存的双核 VPS,20 美金一个月的那种,一个高级 php 开发的每月工资支出,可以买 200 个这种主机了
    Without Sessions:
    Laravel: 609.03 requests per second (mean)
    Zend: 559.91 requests per second (mean)
    Symfony: 532.97 requests per second (mean)

    With Sessions:
    Laravel: 521.64 requests per second (mean)
    Zend: 484.94 requests per second (mean)
    Symfony: 439.37 requests per second (mean)

    1000rps,只要四核就搞定了,4 台八核搞不定,我觉得他们要优化的不是框架,是研发团队自身
        111
    gouchaoer   2017-04-30 19:16:18 +08:00 via Android
    @msg7086
    你去看看 github 上的 php framework benchmark 那个 repo 吧,不只有 cpu 消耗,laravel 的内存消耗也惊人
        112
    gouchaoer   2017-04-30 19:20:52 +08:00 via Android
    https://github.com/kenjis/php-framework-benchmark/blob/master/README.md
    这内存消耗,你 php-fpm 能开几个 worker 进程?
        113
    printempw   2017-04-30 19:28:10 +08:00
    @gouchaoer 引文:「 laravel 我是真的读不懂源码,也没法单步调试一次请求,因为里面都是 closure 和啥 bus,各种跳来跳去,不懂」

    Laravel 中的 Bus 应该是译为「总线」。而且读不懂框架内部实现哪有怪框架的?
        114
    dawniii   2017-04-30 19:41:50 +08:00
    @sagaxu 刚进去看了下压测参数 有点感人。。。ab -t 10 -c 10 http://server.address/
        115
    sagaxu   2017-04-30 20:45:42 +08:00
    https://github.com/kenjis/php-framework-benchmark/的测试,本地搭了一个测试了一下


    做了一点小小的 patch,不然用例是错的



    结果如下,
    |framework |requests per second|relative|peak memory|relative|
    |-------------------|------------------:|-------:|----------:|-------:|
    |ci-3.1 | 5,778.00| 6.8| 0.38| 1.0|
    |slim-3.0 | 4,808.94| 5.7| 0.56| 1.5|
    |laravel-5.3 | 849.19| 1.0| 2.04| 5.4|

    注释掉 laravel 中默认开启的,但是无用的 middleware 之后,结果如下
    |framework |requests per second|relative|peak memory|relative|
    |-------------------|------------------:|-------:|----------:|-------:|
    |ci-3.1 | 6,256.39| 4.3| 0.38| 1.0|
    |slim-3.0 | 4,977.89| 3.4| 0.56| 1.5|
    |laravel-5.3 | 1,453.05| 1.0| 2.02| 5.3|

    把 fpm 的 max_children 从 2 改为 1,结果如下
    |framework |requests per second|relative|peak memory|relative|
    |-------------------|------------------:|-------:|----------:|-------:|
    |ci-3.1 | 3,293.76| 4.1| 0.38| 1.0|
    |slim-3.0 | 2,583.93| 3.2| 0.56| 1.5|
    |laravel-5.3 | 803.36| 1.0| 2.02| 5.3|


    laravel 跟 slim 和 ci-3.1 相比,在 hello world 的比拼下是比较慢,但是也绝对不是 1000rps 都扛不住的地步。
    而且真实的业务,不可能就是输出一个写死的 hello world,业务逻辑自身有 php 代码,还要访问 db 和 cache,这些大部分占执行时间的代码都是一样的,框架执行时间只是小部分,框架占用的内存也只是小部分,把只占用 20%不到的资源,优化提高 100 倍,也只是把开销从 100 减少到 80 而已,这点儿性能提升或者内存减少,毫无价值。


    最后,把性能拿出来说事前,得先把日 PV 做到 3000 万以上,否则那点儿访问量用什么还不都一样。
        116
    gouchaoer   2017-04-30 20:51:29 +08:00 via Android
    @你的 3kw 的 pv 平均下来就是 1000 的 qps 了(每天算 10000s 的访问时间),前面人也所说了 4 台 vps 扛 1000qps 都想换,你再看看内存,laravel 内存消耗是 ci 的几倍。。。
        117
    gouchaoer   2017-04-30 20:53:42 +08:00 via Android
    php7 平均下来提高一倍的 qps 都促使各厂升级,你哪里来的自信说 laravel 是 ci 的 1/5 的 qps 但是性能不重要?
        118
    sagaxu   2017-04-30 20:59:36 +08:00
    @sagaxu 以上测试看起来有 3 倍多到 4 倍多的性能差距,RPS 是 1400,4900,6200,叠加上 RPS 不到 100 的业务逻辑代码之后,真实的 RPS 就变成 98, 99, 100,性能差距完全被业务逻辑代码给抹平了。

    内存占用分别 2.02,0.56,0.38,看起来差距很大,如果业务逻辑自己占个 20M 内存,叠加上去,变成 22.02,20.56,20.38,差距还有多大?

    这些 micro benchmark 最大的问题,是忽略了一点,业务逻辑自身消耗的 CPU 和内存才是大头,看似几倍几十倍的差距,一旦叠加上业务逻辑,差距就变得不再明显,因为那是加法,不是乘法。要知道,在局域网内走 TCP,几次 redis 访问就要几个毫秒了,真实场景下,单核的 RPS 是很难做到 1000 以上的,能做到 100 已经算不错的了。
        119
    gouchaoer   2017-04-30 21:22:51 +08:00 via Android
    业务逻辑本身不是很消耗内存的,大部分内存消耗是框架带来的啊。。。 @sagaxu
        120
    sagaxu   2017-04-30 22:28:59 +08:00
    @gouchaoer 不用任何框架的 fpm 进程也占用 15-20M 内存了,这部分的确不能算在业务逻辑中,但是也不能随便把它从分子和分母中同时减去。而且业务也要看情况的,我们 fpm 进程内存限制到 128M 的时候,有些请求就报错了。有一些基础数据,是作为 php 代码 load 进来的,比如 371 个城市的信息,以及 371 个城市每个城市的配置信息,这些很容易就超过 2M 内存了。
        121
    denghongcai   2017-04-30 22:52:45 +08:00
    @zencoding 哈哈,真理
        122
    denghongcai   2017-04-30 23:00:59 +08:00
    单请求内存峰值 Laravel 毋庸置疑是比其他框架 /原生大的,每次请求 bootstrap 框架的时间也是很高的,可以尝试下 https://github.com/garveen/laravoole 这类项目

    加上业务逻辑的情况下,对 MySQL / Cache 这种外部系统的请求都是同步 I/O 调用,对性能影响还是挺大的,耗在框架上的时间占比很难讲。具体情况具体分析吧

    最后一句:不要抛开场景来谈技术选型
        123
    gouchaoer   2017-04-30 23:33:54 +08:00 via Android   ♥ 1
    @sagaxu
    371 个城市数据配置请用 yaconf,php 每个请求都加载一遍很不划算
        124
    jiujianlu   2017-04-30 23:52:05 +08:00
    真心不喜欢 Laravel,除了官网做得漂亮,实在找不出什么优势。
    小项目我不会选这么重的框架,大一点的项目我会选 Symfony 2/3。

    Laravel 想在工程化和极客范之间寻找平衡,最终给我的却是一种华而不实的感觉,喜欢不起来。
        125
    sagaxu   2017-04-30 23:55:06 +08:00
    @gouchaoer 这类业务我们已经用了 swoole 常驻内存,fpm 里还剩一些暂时没迁移完的业务。性能要求很高的业务,跑 JVM 上了,性能要求高的基础设施,是 Java,C++和 Go 做的,PHP 做起来太累太麻烦。

    swoole+php7 基本上可以榨干 php 的性能了,swoole 的协程用起来也还可以,虽然没有 go 语言方便。
        126
    msg7086   2017-05-01 06:59:14 +08:00
    @bianhua 我说的是「通宵改原生」的代价,不是在说性能本身。
        127
    gouchaoer   2017-05-01 08:38:06 +08:00 via Android
    @sagaxu
    swoole 的 http 压测 qps 应该和单页 php/phalcon/yaf 一样啊,你们换 swoole 后 qps 有提升么?
        128
    bianhua   2017-05-01 10:22:27 +08:00
    @msg7086 哦,我错了(捂着脸跑
        129
    ibegyourpardon   2017-05-01 11:15:12 +08:00
    @ovear 我插个嘴跑个题,代码规范和框架约束这两者其实几乎每个人都早晚会遇到这些。

    但我个人职位是偏技术管理方向,就我的经验看来……代码规范总会有执行不好的时候,而通过框架实施某种半强制的约束,其实总体上来看,在大家的交流方面是省心一些的。

    虽然我也觉得其实限制死了有时候挺不爽,但写久了发现还是工具框架的约束比规范来得靠谱……

    当然这个话题和这里说 Laravel 其实没有什么直接关系就是了。
        130
    ibegyourpardon   2017-05-01 11:24:29 +08:00
    同是 Laravel 5.2,一套东西上,我们跑过一秒钟 100 都扛不住的业务,也跑过 2000+无障碍……

    这种锅我觉得纯粹丢给 Laravel 或者 PHP 或者服务器都不对。

    我就是那个同环境下 100 跑不过跑到 2000 + 的人。

    重新思考了业务,一步步拆开,重新组合,总有办法。
        131
    sagaxu   2017-05-01 13:50:06 +08:00
    @gouchaoer 和我直接有关的那个 case,没法跟 fpm 对比,不用 swoole 协程得开 1000 到 3000 个 fpm 进程,吃不消。如果不用 swoole,只能 Java 或者 Go 了。其它迁移到 swoole 的项目,CPU 降低了很多。因为 swoole 是我们厂维护的,所以不大可能考虑其它标榜高性能的 php 框架。
        132
    dawniii   2017-05-01 15:45:39 +08:00
    @sagaxu 使用 swoole 替代传统的 php 开发模式吗?感觉牺牲了 php 无状态的优势,不太好。需要效率的地方我感觉换个语言才是王道
        133
    sagaxu   2017-05-01 16:40:10 +08:00
    @dawniii php 的无状态那不是优势是劣势,无状态是架构上的,节点之间对等可替换,但是节点自己,需要记住一些自己的 metadata,内部是需要状态的。
        134
    dawniii   2017-05-01 21:25:45 +08:00
    @sagaxu 我说的无状态,可以理解为。撒开膀子就是干。我不用特别关心内存会不会释放,不用担心第三方库是不是因为常驻内存而有什么奇怪的情况发生。因为每次请求就看做是一次生命周期。
        135
    dawniii   2017-05-01 21:33:22 +08:00
    @sagaxu 无状态会让很多事情变得简单,这也是 php 开发效率高的原因,对比下 java 和 php 的部署。php 环境搭建好,覆盖文件就是更新了。为什么要把简单的事情复杂化呢。不如换个更擅长的语言。
        136
    sagaxu   2017-05-02 00:16:09 +08:00
    @dawniii

    先说内存的事,Java 和 Go 都有成熟的 GC,除非你开着全局变量并且一直往里塞东西,否则泄露不了内存,每个请求的 handler 是个闭包或者函数,只要不故意定义超过函数生命周期的变量,你不玩 off-heap 黑魔法,完全不会泄露内存。

    部署的话,php 和 python 差不多,比起 Java 和 Go 麻烦太多了,Go 最简单,就一个可执行文件,大部分情况下也不依赖什么运行库。Java 比起 go 稍微麻烦一点,就是需要先安装一个 JRE,然后也是一个 jar 包直接运行(现代 javaweb 一般内置了 tomcat 这类 webserver),复杂一点就是把 war 扔到 tomcat 的 webapps 目录,它会自动重启。

    php 和 python 就麻烦很多了,用 pip/pear 安装扩展的时候经常会遇到 xxx.h 找不到,典型的比如 db 驱动。然后还必须前置一个 nginx 或者 apache,fastcgi 配起来还麻烦,不同框架配置方法不一样,还要提防 cgi 的 fixpath 问题。python 稍微好一些,uwsgi 比较简单,或者直接走 http 协议更简单。Java 和 Go 的最简单,把 static 资源外的直接 proxy_pass 走就行了。
    PHP 光是把环境搭一遍都很麻烦。

    php7.1 开始内置代码的 cache 了,改 php 文件是没用的,改完文件得重启 fpm 进程才能生效,这个应该是性能增强带来的副作用。在需要重启服务以后,php 的新版本手动部署,已经跟 java 或者 go 没有不同了。




    觉得 php 部署简单的,我提个前几年遇到过好几次的场景,看看大家有没有好办法。

    几台服务器,无外网连接,系统有 rhel5 和 rhel6,还有 ubuntu12 和 14,还有 windows 32 位和 64 位都有,用到的数据库是 pgsql 和 db2,如何打包 php 程序过去部署?

    当时我的解法是,Java 给每个平台下载一个 JRE,应用打成 jar 包就好了,db 驱动也是 java 实现的,直接打进 jar 包里了,不依赖运行库。php 真的难倒了我,最后,我给每个平台下载了对应版本的 vmware,然后为 php 制作了虚拟机镜像,把兼容性工作交给了 vmware 去做。还好那些机器都有图形界面和 root 帐号,不然还得折腾无 gui 甚至无 root 的情况下怎么安装 vmware。
        137
    hellowwo   2017-05-02 09:28:39 +08:00
    @sagaxu 你这种情况用 Docker 会更好
        138
    sagaxu   2017-05-02 09:31:30 +08:00 via Android
    @hellowwo 给无外网网络的 rhel5 和 windows 装 docker,你是在开玩笑吗?
        139
    pein   2017-05-02 10:01:49 +08:00
    laravel 中的一些思想是好的,跟我不知道 laravel 时的一些想法不谋而合,就是个人认为它可能在实现或者封装上过于复杂了点。外国人写框架就是这样,一门心思实现自己的想法,不怎么关注性能什么的,自己爽就行了。
        140
    hellowwo   2017-05-02 10:22:19 +08:00
    @sagaxu 你不知道离线安装这回事吗?
        141
    sagaxu   2017-05-02 10:30:10 +08:00
    @hellowwo 呵呵,不要说是离线,就是给你没有墙的网,你在 rhel5 和 win2008 上装一个 docker 试试看,内核太老不支持,你有办法?
        142
    lygmqkl   2017-05-02 10:30:29 +08:00   ♥ 1
    说句老实话 本来不想回答的,怕惹非议,但是还是忍不住说 2 句

    第一 多一种框架是好的,但是 Laravel 有点特别
    第二 请主要参考国内大公司商用场景,我了解下来 Yii1/2 用的更多一些,至少在国内目前 Yii 不温不火的前提下,这个反查有点显眼。
    第三 主要是给新人看的,老实说懂一些的都有自己的看法,唯独新人会考虑到处看看,哪个口碑好,所以大家谨慎。
        143
    Z1076   2017-05-02 12:16:19 +08:00
    在 V2 我就没见过没被喷的 PHP 框架, 前一排是 TP。 现在轮到 laravel ?
        144
    hellowwo   2017-05-02 12:47:58 +08:00
    @Z1076 用 laravel 的公司多起来了,是个机会。
        145
    e9e499d78f   2017-05-02 14:57:00 +08:00
    @sagaxu php7.1 开始内置代码的 cache 了,改 php 文件是没用的,改完文件得重启 fpm 进程才能生效,这个应该是性能增强带来的副作用。在需要重启服务以后,php 的新版本手动部署,已经跟 java 或者 go 没有不同了。
    -----

    非也非也。

    http://php.net/manual/en/intro.opcache.php :
    This extension is bundled with PHP 5.5.0 and later, and is » available in PECL for PHP versions 5.2, 5.3 and 5.4.

    http://php.net/manual/en/opcache.configuration.php#ini.opcache.revalidate-freq :
    opcache.validate_timestamps boolean

    If enabled, OPcache will check for updated scripts every opcache.revalidate_freq seconds. When this directive is disabled, you must reset OPcache manually via opcache_reset(), opcache_invalidate() or by restarting the Web server for changes to the filesystem to take effect.
    opcache.revalidate_freq integer

    How often to check script timestamps for updates, in seconds. 0 will result in OPcache checking for updates on every request.

    This configuration directive is ignored if opcache.validate_timestamps is disabled.
        146
    gouchaoer   2017-05-02 19:45:31 +08:00 via Android
    @sagaxu
    我看韩天峰在 weibo 上说过他是用 phar 给 php 打包然后放 swoole 中部署的,和 java 一样。。。。这里我就很反对这种做法,php 的很大优势就是热更新,打包直接失去了这个优点,因为 swoole 本质上作为一个 php-cli 没法像 php-fpm 那样无状态。。。。

    你的那个场景 php 应用是 php-cli 还是 php-fpm 应用呢?如果是 php-cli,php 在 win 下有绿色版,在 linux 下没有绿色版但是你可以打包一个带有系统依赖的 php-cli,然后释放到对应系统中,比较 dirty。。。如果是 php-fpm 那就无解了
        147
    sagaxu   2017-05-02 23:51:55 +08:00
    @gouchaoer 我反而蛮看好 phar 的,打包可以让分发和安装更简单,热更新跟打包也不矛盾,java 的 war 包一样支持热更新。

    我那个场景是 fpm,即便跑 cli,各种发行版自己编译一遍 db2 驱动也很累人的,要把各个环境都搭一遍再编译出来,这个时候交叉编译也很麻烦的
        148
    aksoft   2017-05-16 08:42:57 +08:00
    人家问开发起来舒不舒服~
    我来回答,舒服~~爽
        149
    ttomath   203 天前
    @woshixiaohao1982 哈哈哈,他可能还不知道有注解路由之类的玩意儿,还在想象 struct2 和 spring 早期的玩意儿
        150
    TangMonk   113 天前 via iPhone
    真正优雅的是 rails,没有一个框架论优雅比得上他
    1  2  
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4182 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 32ms · UTC 07:40 · PVG 15:40 · LAX 23:40 · JFK 02:40
    ♥ Do have faith in what you're doing.