[吐槽]刚读了 yii3-demo, PHP 框架是怎么把 PHP (优雅的)玩死的。

2020-04-13 16:30:36 +08:00
 dvaknheo
虽然是看 yii3-demo 吐槽的,但 Laravel 等框架也适用。

业务代码里,和框架相关的代码越少才是耦合性越低啊。口口声声说解耦,但是一看代码里一堆和框架代码相关的,这能叫解耦么。

业务代码里,框架相关的代码多,意味着碰到框架相关的代码就越多

读代码,最怕的之一是:这东西怎么来的。 一两个特例马上能教人懂,多了没法马上会啊。

View 里不能做任何计算,不能 include 非 View 的代码。

Laravel 优雅的带着 PHP 优雅的 Java 化。当初 PHP 上手就干的年代,这是 PHP 的优势。

现在一堆代码,业务相关的没几行,这还是 PHP 么。

ORM 就非用不可么,Data struct 不容易理解么

有好用的文件路由不用,非得手写路由 (src/Factory/AppRouterFactory.php)
PHPer 的原则应该是 其他路由模式是文件路由的补充啊。

配置文件里一堆 use (config/web.php)

MVC 缺层都是大家的共识了, 业务逻辑层叫 Service 或 Logic 我都无所谓,但直接 Controller 里调用 ORM,以前 10k 行的 Controller 啊。 从 Controller 里把业务逻辑剥离出来,跑命令行测试不好么。

PHP 开发速度很快,运行速度也很快。 没必要为了那些优雅牺牲开发速度,运行速度。

讲真,我动力再足一点,写个同功能的 插进这些框架的 demo 中, 让大家见识一下应该用什么样的手段最符合 PHP 的快速开发模式。
16145 次点击
所在节点    PHP
126 条回复
meshell
2020-04-15 09:41:06 +08:00
@ipwx 写业务的那个不是 curd?
meshell
2020-04-15 09:47:29 +08:00
@yc8332 工程化吧。
meshell
2020-04-15 09:51:44 +08:00
@hantsy Silex 还用这个。。早不维护了。。
encro
2020-04-15 09:56:31 +08:00
@HiCode

首先,laravel 将性能降低到原生 4%左右,这个标准是什么,难道我们平时只开发 hello world ? laravel 哪个地方导致性能低了有清楚吗?是不是某个配置,某个插件导致的?不用这个配置或者插件行不行?环境配置是怎样的?有没有开启 opcache 呢,首次运行还是非首次运行?

如果不清楚这些,你只是人云既云的的程序员,没事瞎起哄。


其次,laravel 性能很重要吗?我前面提到真实环境一个 4 核 8G 一年也能跑上亿交易额,每天几千单。对我和我的团队来说,用框架我能快速定位性能问题,快速上线,统一标准统一文档代码容易维护能让我节省多少时间,团队少招聘的人,用来给其他程序加工资不更好吗?


ps:

我自己实际测试的时候,YII2,5 年前购买的笔记本 4c8g,linux 系统,fpm 配置了 150 最大请求,开启 opcache,代码连接一次 db,纯 PHP 4000rps,框架自带 DB 类不用 ORM 2500rps,用框架 ORM 500rps 。

实际项目中,我全采用 ORM,平均每秒钟处理 50-200 个请求,nginx 日志显示 fastcgi 响应时间是 5-50ms,我觉得够用了。再不行人员开支上节省的钱,我再加点服务器配置足够了。
caola
2020-04-15 10:00:09 +08:00
P++ 已经在路上了……
HiCode
2020-04-15 10:06:38 +08:00
@encro 标准是什么,我发的那个地址有,这是一个 web 框架性能评测的网站,有详细的测试标准及说明,请自己阅读。

不仅包含 PHP 的框架,还有其他语言其他框架,我给的链接为了方便大家查看,只筛选了 PHP 框架。

不是人云亦云,你好好看这个网站的数据,人家已经测试到第 18 期了,先看,看完再评论,不要不看就自嗨。
HiCode
2020-04-15 10:07:45 +08:00
@encro 你们的项目很牛逼,你们有钱,我前面的回答里面已经说了,土豪请随意。

你们是土豪,可以忽略无视我的,谢谢!
jowan
2020-04-15 10:22:54 +08:00
@HiCode 你这个榜单 我看了第 18 期 几乎没什么设计模式的 CI 都比 Laravel 排名低
而且测试的内容就是 hello word 呀 你想表达什么?
HiCode
2020-04-15 10:38:05 +08:00
@jowan 我可没说 ci 这种“不优雅”性能就好,你看过 ci 的代码就知道它为了方便开发者,各类初始化配置及自动加载会产生不小的性能损耗。

记住了,优雅,会产生性能损耗,反对过度设计——这是我说的,我认为的,我所表达的。

但,不优雅也有多种,不优雅也可以绕着远路产生性能损耗——ci 的是这一种。

你不能把我所强调的“避免过度优雅”等同于 ci,这两者扯不上关系的,请更正这个认识。



讨论真费力。
encro
2020-04-15 10:38:45 +08:00
@HiCode

才看到你前面发的链接,看了下测试代码和环境,比较公平和准确。
收回我前面的话,说声抱歉。


Single query On Cloud

PHP 15,248
php-laravel-query-builder 4,867
yii2 2,545
laravel 1,087

Multiple queries On Cloud
php 1,897
yii2-raw 1,677
yii2 919
php-laravel-query-builder 825
laravel 430

这个是非常有意义的:
随着页面查询增加,性能差别变少。且这都是在框架不开启数据缓存的情况下。
如果开启缓存,那么就。。。作弊了。。。


你是希望轻量级框架,这个也已经有很多轮子也多了。如 slim,micro 等,
但是为什么我们知道的少?
我认为应为太容易了啊,很容易就自己造一个,所以大家都自己造去了,导致不集中没有流行广的框架。

ROR,django, yii, laravel, symfony 都是比较重量级的,
适合团队有前端,后端,API 接口规模的,
当然熟练了,也可以在小团队适用,比如我现在就是 3 个后端采用 YII2 的,2 年时间大小开发了十来个公司自己用的系统 3 个产品吧,目前在用的还有维护和用的有十个左右。如果不用框架,或者用简单的框架我认为做不到。基本我们是九五六吧。

yii raw, php-laravel-query-builder, symfony 等等很多框架都提供了针对 api 的简洁版本。

其实不用 orm 性能就能直接上升一倍以上,但是我还是在我团队让大家优先用 orm,因为维护简单,只有处理个别大量数据导入导出会用到 DB 类和原生 sql.
jowan
2020-04-15 10:40:13 +08:00
@HiCode 请您赐教一下 您现在用的什么?另方便问下您一直在追求高性能,方便了解下你们的业务最大 QPS 大概有多少吗?
jowan
2020-04-15 10:48:02 +08:00
@encro 缓存本身就是一种解决性能的方式,为啥算作弊呢 比 laravel 的 config 和 routes 生产环境开启缓存 0 成本为啥不用呢
HiCode
2020-04-15 10:51:23 +08:00
@encro 我们目前的问题是,PHP 圈是否存在过度强调“优雅”的氛围?我觉得需要适当的反思这种情况。

框架是一定要用的,这是生产力工具,以一定的性能损耗换取开发效率提高非常有意义。

你的技术和经验都是我们其他人所达不到的,有时候更需要你们来考虑 PHP 的发展,来发声让 PHP 能够获得更长久的发展。
HiCode
2020-04-15 10:52:53 +08:00
@jowan 我只是因为穷才追求高性能,我的业务都是薛定谔的“qps”,爆不爆发看策划看设计,我只负责打造一个“低成本高效率”的系统。
HiCode
2020-04-15 10:55:06 +08:00
@jowan 我自己抄了一个框架,技术能力太菜,只能到处看别人的代码抄一抄,不开源,因为没时间应对各种小白询问。
dvaknheo
2020-04-15 10:59:08 +08:00
@jhdxr 恕我浅薄,我真不知道依赖注入,对于动态语言,除了解决 [调用方式不变,实际实现可变] 功能之外还能有什么用。

各 php 框架内部不用 ob 系列方法实现么?超长字符串拼接效率高还是 ob 函数分段输出效率高?

我所说的热修复,就是不强行去改第三方库的代码,修复出第三方库出现的功能。

就是要跟踪到第三方库还没解决问题,这才是折腾。

第三方 lib 能学用当然用。吐槽的是 framework .
mitu9527
2020-04-15 11:19:08 +08:00
以前 PHP 的主要用途就是微型、小型项目,使用面向过程(事物脚本)直接开干当然合适。面对业务逻辑复杂的中型、大型项目,你用面向过程试试,不作死自己就怪了。这几年 PHP 的发展趋势就是面向对象化且提高性能,以支撑中型、大型项目。至于你说的什么 ORM 那也不是 PHP 导致的,想要开发中型、大型的项目,一般都是用分层架构和领域模型,在配合测试和工具链等,才能保证项目成功。直接开干的时代已经过去了,不论哪种语言。至于过度“优雅”这种观点,哪种技术变成主流不都是从“上头”开始的,如果开始都不愠不火,后面谁还搞。
encro
2020-04-15 11:19:32 +08:00
@jowan
性能测试的时候,开启 opcache 是公平的,HiCode 给的连接也是开启了 opcache 的。
如果开启数据缓存,有的框架没开启,这就不公平了,不好比了,开启后命中率等影响较大。

而且缓存级别也是有很大差别的,比如 head 直接返回 304 HTTP 304,直接 http 头设置一个超时时间两者区别都很大啊。比如 Yii 的请求,页面,widget 局部,data 级别缓存,每一级性能差别都很大啊。如果我开发一个 blog,为了测试性能好,我直接设置一个一小时过期头,那么其他框架都别比了,原生都别比了。。。所以是作弊。。。规则就是咱还是比谁代码写的好吧。

但是生产环境,可以根据情况设置缓存。

框架性能只是架构其中一个考量,大部分公司而言,都放不到第一,人员招聘容易度和开发维护成本重要程度都比它高得多。
nicoljiang
2020-04-15 11:33:03 +08:00
PHP 这个语言的定位就是做小工具或者单纯项目的。
搞出这些框架的人,就是想涨工资,又不愿意学更适合其场景的语言(说是因为喜欢 PHP,但他可能已经忘了当初为何喜欢 PHP,所以就是懒,不想离开 PHP 的舒适圈)
所以就把这个生态搞得人不人鬼不鬼。
nicoljiang
2020-04-15 11:34:35 +08:00
明明可能有另一条更适合的路可以走(类似 lua 、python 的方向),非要搞得像垂死挣扎一样,死赖在所谓的「企业级复杂业务场景」。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/662007

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX