1
ketle 2016-03-21 13:19:50 +08:00
查 10 次 sql 就有用了
|
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 |
4
zhidd OP @mcfog mysql 的 persistent 连接,前 10 秒,我访问了 a.php 后,php-frm 模块会释放 persistent 连接,过了 10 秒,我又访问 a.php,它是重新 persistent connection ,而且 persistent connection 首次链接很耗时间,然而并没有卵用
|
6
skydiver 2016-03-21 14:05:41 +08:00
@zhidd 持久连接可以跨请求保持的。如果你用的 php-fpm ,设置 pm.max_request = 500 ,那么 500 次请求才会重启一次 worker 进程,那么持久连接就可以 500 次请求里共用。
|
7
mcfog 2016-03-21 14:06:24 +08:00
@zhidd
是整个 PHP 社区出问题,弄一个没有实际作用的 feature 的可能性大?还是你自己配置、使用不当的可能性大?十秒内访问是否正常复用连接了?如果你觉得十秒就释放不合理,有没有找过哪里配置这个时间呢? 以上。 看轻别人觉得没意义然并卵是你的权利 |
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 ),目前来看不建议使用持久连接,其实每次都开一个连接消耗也不是很大。 |
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 要放到每一个页面响应中去完成。 |
10
linpf 2016-03-21 23:01:42 +08:00
可以用 php-cli 或者其他语言做个数据库连接池,守护进程运行,然后通过 socket 传递 mysql 请求与返回数据。
|