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

2016-03-21 13:13:09 +08:00
 zhidd
比如说,前 10 秒,我访问 a.php,里面有个 static 的 mydql 链接,过了 10 秒,我又访问 a.php,,我是无办法使用上一次的 static 的 mysql 链接。看过 discuz 、 phpcms 的源码,都有工厂模式, new 出来的单例好像没什么意义,浪费内存
3833 次点击
所在节点    问与答
11 条回复
ketle
2016-03-21 13:19:50 +08:00
查 10 次 sql 就有用了
zhidd
2016-03-21 13:25:18 +08:00
@ketle 你意思是一个页面级别,如果需要查 10 次 sql 就起作用了,
mcfog
2016-03-21 13:27:17 +08:00
1. 既然单次页面访问后会释放,何来浪费内存一说?
2. PHP 单例的作用随便列一列

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

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

参考 http://php.net/manual/zh/pdo.connections.php#example-963
zhidd
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
2016-03-21 13:58:36 +08:00
@zhidd 试一下把 php-fpm 的最小进程数调大一点, 但不能大过 mysql 的最大连接数
skydiver
2016-03-21 14:05:41 +08:00
@zhidd 持久连接可以跨请求保持的。如果你用的 php-fpm ,设置 pm.max_request = 500 ,那么 500 次请求才会重启一次 worker 进程,那么持久连接就可以 500 次请求里共用。
mcfog
2016-03-21 14:06:24 +08:00
@zhidd

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

以上。

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

还有持久连接在 PHP-FPM 模式下是不好使(个人拙见: https://iyaozhen.com/php-mysql_pconnect-discuss.html ),目前来看不建议使用持久连接,其实每次都开一个连接消耗也不是很大。
spance
2016-03-21 14:59:55 +08:00
php 没有生命周期,像 java python ruby nodejs 。。。这些 web 应用结构上都有 application session page 等生命周期, php 这货只是一个进化版的 cgi 而以,遇请求则解析,没有生命没有周期。
你说的这是数据库连接池, php 这种以 cgi 为底线的结构上是不可能存在的。于是别人在 web 容器的生命周期可以干的事情, php 要放到每一个页面响应中去完成。
linpf
2016-03-21 23:01:42 +08:00
可以用 php-cli 或者其他语言做个数据库连接池,守护进程运行,然后通过 socket 传递 mysql 请求与返回数据。
hankwh
2016-03-23 10:50:19 +08:00
@mcfog 霸气~

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

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

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

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

© 2021 V2EX