php 页面每次访问后,都会释放所有资源,也就是说,单例的写法,没什么意义,有人说 php 是页面级别,除了页面级别,单例写法没用 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhidd
V2EX    问与答

php 页面每次访问后,都会释放所有资源,也就是说,单例的写法,没什么意义,有人说 php 是页面级别,除了页面级别,单例写法没用

  •  
  •   zhidd 2016-03-21 13:13:09 +08:00 4177 次点击
    这是一个创建于 3494 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如说,前 10 秒,我访问 a.php,里面有个 static 的 mydql 链接,过了 10 秒,我又访问 a.php,,我是无办法使用上一次的 static 的 mysql 链接。看过 discuz 、 phpcms 的源码,都有工厂模式, new 出来的单例好像没什么意义,浪费内存
    11 条回复    2016-03-23 10:50:19 +08:00
    ketle
        1
    ketle  
       2016-03-21 13:19:50 +08:00
    查 10 次 sql 就有用了
    zhidd
        2
    zhidd  
    OP
       2016-03-21 13:25:18 +08:00
    @ketle 你意思是一个页面级别,如果需要查 10 次 sql 就起作用了,
    mcfog
        3
    mcfog  
       2016-03-21 13:27:17 +08:00   1
    1. 既然单次页面访问后会释放,何来浪费内存一说?
    2. PHP 单例的作用随便列一列

    + 即使单例的生命周期只有一个请求内,照样能有很好的节省内存作用(比如 IP 库、拼音表之类的场景,单个实例很可能占用大量内存,一次请求很可能大量涉及调用,单例效果明显)
    + 同理,除了内存,还节省其它各种资源,比如 mysql 连接数, redis 连接数,句柄数等等,另外还节省初始化的开销
    + 单例伴随工厂,对代码可读性、可测试性等都是提升
    + 单例可以实现维护统一状态,比如说单例一个 mysql 连接,就可以在实例里维护 db 请求次数、总耗时什么的

    3. 最后, db 连接、 redis 连接之类的,往往还会通过“持久连接” persistent connection 实现跨请求的资源复用

    参考 http://php.net/manual/zh/pdo.connections.php#example-963
    zhidd
        4
    zhidd  
    OP
       2016-03-21 13:43:15 +08:00
    @mcfog mysql 的 persistent 连接,前 10 秒,我访问了 a.php 后,php-frm 模块会释放 persistent 连接,过了 10 秒,我又访问 a.php,它是重新 persistent connection ,而且 persistent connection 首次链接很耗时间,然而并没有卵用
    wesley
        5
    wesley  
       2016-03-21 13:58:36 +08:00
    @zhidd 试一下把 php-fpm 的最小进程数调大一点, 但不能大过 mysql 的最大连接数
    skydiver
        6
    skydiver  
       2016-03-21 14:05:41 +08:00
    @zhidd 持久连接可以跨请求保持的。如果你用的 php-fpm ,设置 pm.max_request = 500 ,那么 500 次请求才会重启一次 worker 进程,那么持久连接就可以 500 次请求里共用。
    mcfog
        7
    mcfog  
       2016-03-21 14:06:24 +08:00
    @zhidd

    是整个 PHP 社区出问题,弄一个没有实际作用的 feature 的可能性大?还是你自己配置、使用不当的可能性大?十秒内访问是否正常复用连接了?如果你觉得十秒就释放不合理,有没有找过哪里配置这个时间呢?

    以上。

    看轻别人觉得没意义然并卵是你的权利
    iyaozhen
        8
    iyaozhen  
       2016-03-21 14:13:57 +08:00   1
    web 开发的话你说的这种情形确实用处不大。但别的场景还是可以用的,比如一些复杂的脚本程序。目前来看 Nginx+PHP-FPM 的模式简单、高效、实用,基本的业务场景都能满足。

    还有持久连接在 PHP-FPM 模式下是不好使(个人拙见: https://iyaozhen.com/php-mysql_pconnect-discuss.html ),目前来看不建议使用持久连接,其实每次都开一个连接消耗也不是很大。
    spance
        9
    spance  
       2016-03-21 14:59:55 +08:00   1
    php 没有生命周期,像 java python ruby nodejs 。。。这些 web 应用结构上都有 application session page 等生命周期, php 这货只是一个进化版的 cgi 而以,遇请求则解析,没有生命没有周期。
    你说的这是数据库连接池, php 这种以 cgi 为底线的结构上是不可能存在的。于是别人在 web 容器的生命周期可以干的事情, php 要放到每一个页面响应中去完成。
    linpf
        10
    linpf  
       2016-03-21 23:01:42 +08:00
    可以用 php-cli 或者其他语言做个数据库连接池,守护进程运行,然后通过 socket 传递 mysql 请求与返回数据。
    hankwh
        11
    hankwh  
       2016-03-23 10:50:19 +08:00
    @mcfog 霸气~
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1033 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 18:36 PVG 02:36 LAX 11:36 JFK 14:36
    Do have faith in what you're doing.
    ubao 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