Laravel 服务容器的优势是什么? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
PHPNewbie
V2EX    PHP

Laravel 服务容器的优势是什么?

  •  
  •   PHPNewbie 2017-06-30 10:57:48 +08:00 6710 次点击
    这是一个创建于 3040 天前的主题,其中的信息可能已经有所发展或是发生改变。

    刚入门 Laravel 服务容器。Laravel 的服务容器,对象的实例化由以下这种方式完成:

    $obj1 = $container->make('class1', 'class2'); $obj2 = $container->make('class3', 'class4'); 

    而以下这种方式的实例化同样可以做到:

    $obj1 = new class(new class2()); $obj2 = new class3(new class4()); 

    那服务容器的优势到底是什么呢? 希望大佬能够用具体例子来体现或是解释一下服务容器的优势,小的多谢了。

    24 条回复    2018-01-31 17:10:52 +08:00
    Moker
        1
    Moker  
       2017-06-30 11:17:03 +08:00
    可以去看下 依赖注入和控制反转
    assad
        2
    assad  
       2017-06-30 11:21:42 +08:00
    竟玩一些花活,框架性能烂的要死!
    mooncakejs
        3
    mooncakejs  
       2017-06-30 11:25:22 +08:00   1
    优势就是 1 楼说的。 说大白话一点就是 依赖接口而不是依赖实例。 不过 php 玩这个确实有点自宫的感觉。
    zhengwenk
        4
    zhengwenk  
       2017-06-30 11:28:35 +08:00
    其实就是所谓的依赖注入 DI 和 控制反转 IOC。
    Ouyangan
        5
    Ouyangan  
       2017-06-30 11:47:22 +08:00   2
    我写 java 后端, 容器简单理解就是:不要你自己管理对象的生命周期 ,创建,销毁都交给容器来管理 . 要用的时候注入对象就好了 , 有利于代码解耦和测试 , 这个设计思想仁者见仁智者见智.
    底层数据结构一般是线程安全的哈希表 .
    asen477
        6
    asen477  
       2017-06-30 12:00:00 +08:00   1
    浪费资源开销。。概念机的炒作
    有好有坏
    random2333
        7
    random2333  
       2017-06-30 13:33:32 +08:00
    @assad laravel 的性能测试烂,和配置优化还有默认开启 session 有关系,真实性能不算差的
    abcbuzhiming
        8
    abcbuzhiming  
       2017-06-30 14:16:14 +08:00   1
    laravel 的那套东西,如果玩过 java 的 SSH 系列的都知道是咋回事,我个人不看好,更像是“为了证明我能这样”而搞出来的产物,而且 java 系的 web 最近一直在瘦身,往轻量化方向转,那种层层包装的做法被认为落后于时代,laravel 却觉得那样很好,还要学过来。。。我实在不觉得这有什么好学的,真正 javaee 的优点在于常驻内存,这个角度上,swoole 这样的东西才是未来,laravel 还是没脱离一次请求载入资源处理完毕资源卸载这种 CGI 过程,包装的再华丽有啥用
    abcbuzhiming
        9
    abcbuzhiming  
       2017-06-30 14:17:39 +08:00
    @random2333 在大部分已知 PHP MVC 框架里,他最差,这还不算差是啥,其实差点倒也无所谓,关键是我觉得这家伙路走歪了
    onion83
        10
    onion83  
       2017-06-30 14:20:13 +08:00
    @abcbuzhiming 一个写页面应用,一个写底层服务,使用场景不一样,没必要吹毛求疵吧。
    sagaxu
        11
    sagaxu  
       2017-06-30 14:24:50 +08:00
    我现在离了容器都不会写代码了
    random2333
        12
    random2333  
       2017-06-30 14:25:00 +08:00
    @abcbuzhiming 同意过于层层包装过于复杂,用了太多的魔术方法和闭包。性能在开启 opcache 和执行优化的指令之后没有比其他框架差的
    levn
        13
    levn  
       2017-06-30 14:56:45 +08:00
    ……也算一种“元编程”了
    qiyon
        14
    qiyon  
       2017-06-30 16:45:20 +08:00
    ```
    $log = $container->make('log')
    ```

    并不需要知道 log 具体是什么类,可能是`/Log/DbLog`, 可能是`/Log/FileLog`
    linoder
        15
    linoder  
       2017-07-01 01:34:40 +08:00
    代码迭代速度很高 同时还得保证单元测试覆盖率 这种情况下你说说的“服务容器”优势会非常明显
    xiaotianhu
        16
    xiaotianhu  
       2017-07-01 09:59:31 +08:00 via iPhone
    随便可以替换掉框架种的某个类的实现

    比如我想改造一下系统里的 mysql 类 不用去动框架的代码

    随便找个文件夹写好 注册到容器里就替换了。不耽误升级
    abcbuzhiming
        17
    abcbuzhiming  
       2017-07-02 22:44:25 +08:00
    @onion83 不,你没明白我说的意思,和他们的应用方向无关,而是常驻内存这个关键。近年来 CGI 模式以请求脚本载入执行完毕卸载的方式,受到了 jit 等模式的挑战,javaee 重新开始回暖某种程度上可以视为业界的一种态度,swoole 从设计上是常驻内存的,而 php7 虽然有了围绕 opcache 设计的 jit,但是这玩意在 CGI 模式下真是常驻内存的吗,我鲜有看到这方面的描述。
    abcbuzhiming
        18
    abcbuzhiming  
       2017-07-02 22:45:39 +08:00
    @random2333 有证据吗?网上评测速度慢的证据很多,开了 opcache 和优化后速度上来的证据好像没找到
    random2333
        19
    random2333  
       2017-07-02 23:03:27 +08:00
    http://www.golaravel.com/post/benchmarking-laravel-symfony-zend/ 可以看下这个,然后测试一下和原生 php 的差距 @abcbuzhiming
    z5864703
        20
    z5864703  
       2017-07-03 11:14:25 +08:00
    @abcbuzhiming 常驻内存的话,就得对资源使用精打细算了,php 快速开发有一个优势就是大部分场景不用考虑垃圾回收
    Laravel 的优势就是可以快速搭建一套网站,swoole 写整套网站要疯。
    使用场景都不一样
    麻烦深入了解和理解下各个语言与框架,以及运行机制吧
    onion83
        21
    onion83  
       2017-07-03 11:56:36 +08:00   1
    @abcbuzhiming fastcgi 或者说 php-fpm本来就是用于快速处理请求而生的,常见用于 web。在这种模式下通常会有一个最长的执行时间,超时或者 core 的时候会被 master 从进程池回收掉。

    fastcgi 的应用场景:对业务完整容忍度要求相对低,业务复杂且外部调用不可控( db\network\file ),业务初期快速开发。但缺点是没有原生的连接池,无法实现资源共享,进程间只能通过 apcu 扩展进行内存共享。

    swoole/workman (daemon) 的应用场景:业务稳定,需要更为底层的 handle tcp 状态 ,需要精确把握每个细节。常用于 tcp / websocket server 等开发。好处是:worker 之间通过静态类变量 /table/Atomic 甚至是 global 进行共享,程序性能实现最大化。缺点是,对开发人员要求较高,原本同步的代码会变为异步,增加复杂度,部署相对不便。

    综上述:我认为因为应用场景的不同,我认为是否常驻内存不是关键。

    Laravel 是一个应用层的开发框架,swoole (cli) / nginx+php-fpm / apache+mod-php 只是 php 运行的一种模式,Zend Optimizer/JIT 更是语言编译器的东西。三者根本不是一个维度的东西,没有什么好比较的,而且谁说 Laravel 不能在 swoole 在上面跑?

    问题 1:
    “近年来 CGI 模式以请求脚本载入执行完毕卸载的方式,受到了 jit 等模式的挑战 ……”
    错误,不是一个维度的东西,挑战什么?

    问题 2:
    “ swoole 从设计上是常驻内存的……”
    应为以 daemon 的形式常驻系统,代码一次载入(编译)长期运行,能享受到 opcache/jit 的红利。

    问题 3:
    “这玩意在 CGI 模式下真是常驻内存的吗,我鲜有看到这方面的描述 ……”
    请尝试 Google “ php-fpm share opcache ”
    leunggamciu
        22
    leunggamciu  
       2017-07-03 13:09:15 +08:00
    使用容器来`make`一个实例和手动`new`一个实例最主要的区别是在于依赖的解决。使用`new`,你需要手动传递所有必需的依赖;而使用`make`,当依赖被提前配置好的情况下,容器会帮你解决这部分依赖。这个和接口应该没有什么关系吧
    iVanilla
        23
    iVanilla  
       2017-07-03 13:22:07 +08:00 via Android
    @abcbuzhiming 比性能更差? Symfony 和 Zend Framework 表示不服
    hhxsv5
        24
    hhxsv5  
       2018-01-31 17:10:52 +08:00
    Swoole 来拯救低性能的 Laravel,LaravelS github.com/hhxsv5/laravel-s 有兴趣可尝试下。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     840 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 20:10 PVG 04:10 LAX 13:10 JFK 16:10
    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