为什么 PHP 一直在优化程序执行效率,而不优化数据库连接?

2015-01-09 15:03:30 +08:00
 flash866

底部的连接池技术,应该不是什么难事,比起优化PHP执行效率来说,应该very easy,但是至今仍然没有内置连接池技术(或者类似技术),还是一请求一线程,用完销毁,下次再重新连接。为什么不在PHP中内置相应的解决方案呢?

20998 次点击
所在节点    PHP
29 条回复
hitsmaxft
2015-01-10 23:46:59 +08:00
@leonlu fpm 的配置就那么几个, 你看下文档吧 , pm.max_requests
leonlu
2015-01-11 01:36:30 +08:00
@hitsmaxft 确实如你所言, 是我对php的认识不足. 刚刚补了一下这里的知识, 应该是这样的:

php有三种工作模式. 其中是最常见的是php作为一个模块工作在一个多进程的webserver中, 例如apache webserver. apache会启动一个主进程, 多个子进程(php). 主进程分发请求到子进程上处理. 目前流行的nginx + php-fpm应该也是类似这一种模式, ngnix会把请求转发给php-fpm处理. php-fpm是一个php进程管理器, 维护了一个php进程池, 在接收到请求后分发给php子进程.

在这种模式下, php进程可以是一直存活的. 进程启动时会做进程相关的初始化操作, 比如加载插件. 对于接收到的请求, 会做请求处理的相关初始化->调用相应的php代码做业务操作->销毁请求上下文. 对于php程序员来讲, 每个请求的处理都是全新的上下文, 所有定义/对象/变量完全限定在单个请求处理的这个上下文中. 大家写的php代码到此结束. 当然, php进程也可以被销毁, 这与php-fpm的工作模式有关. 更多细节详见相关文档1+2.

因此, 对于一个这样的php进程, 是可以做持久化数据库连接的, 只是稍有不同. 每个php进程只保留一个持久连接. 例如, php-fpm启动了20个php子进程, 对于同一个数据库和同一个用户名, 最多有20个持久连接. 对于同一个php进程所处理的多个请求, 它们都使用同一个数据库连接. 更多详见文档3.

所以, 这个效果与使用一个连接池也差不多了. 持久连接数取决与php进程的数量. 最终, 持久连接数量/进程数量就需要按实际的情况来调优了.

目前理解是这样, 如有误请指正.

相关文档:

1. php生命周期 http://www.slideshare.net/laruence/the-php-life-cycle
2. php-fpm配置文档: http://php.net/manual/en/install.fpm.configuration.php
3. php持久化连接: http://php.net/manual/en/features.persistent-connections.php
hitsmaxft
2015-01-11 15:01:09 +08:00
@leonlu

对于 php 应用来说, 数据库的链接重用并不是瓶颈, 所以语言开发者不花这个心思也是正常的。
从目前看来, php 应用的最大瓶颈, 是没有 jit 和 弱类型带来的性能负担。这也是 php 社区所应该尽快解决的问题。另外一个问题就是 yii2、lavarel 这些把开发者带进坑里的玩意,大型网站压根就没法用这些往死里浪费性能的重型框架。
jiongjionger
2015-01-11 15:23:19 +08:00
1. 有持久链接
2. 有扩展可以实现复用
NCE
2015-01-11 22:21:19 +08:00
1.php是自己封装的,近几年其他语言发展很快,所以优化php执行效率压力山大;
2.php所使用的mysql是oracle自己发布的,要优化也是oracle的事情……

你以为没有连接池技术么,虽然我没看oracle的代码,但我不信。
yyinsomnia
2015-10-10 23:56:30 +08:00
@hitsmaxft mysqli 支持进程间链接重用的
文档应该不是这个意思。
http://php.net/manual/en/mysqli.quickstart.connections.php

Every PHP process is using its own mysqli connection pool. Depending on the web server deployment model, a PHP process may serve one or multiple requests. Therefore, a pooled connection may be used by one or more scripts subsequently.
hpu423
2016-02-29 11:27:31 +08:00
mark 一下,我也很关注数据库连接池
hheedat
2016-12-08 15:25:05 +08:00
@tomheng 说的好
flash866
2019-12-26 11:26:28 +08:00
好久没来了,已经改 JAVA 很多年了。。。

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

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

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

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

© 2021 V2EX