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

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

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

20997 次点击
所在节点    PHP
29 条回复
msg7086
2015-01-09 15:12:42 +08:00
mysql的连接池技术在1(shi)1(yi)年前就有了。
tini8
2015-01-09 15:15:04 +08:00
数据库持久连接老早就有了
msg7086
2015-01-09 15:18:47 +08:00
至于像java之类那样「真正意义上的连接池」技术,在PHP上是根本不可行的。
PHP就是被设计成每次运行完以后销毁一切状态,任何数据都不会带到下一个执行环境上去的。
所以不可能内置一个全功能的「连接池」,而只能从第三方扩展里实现。
如果你需要全功能连接池技术,那你就不能用PHP而需要用常驻内存型的语言,比如Java,ASPX,Ruby,Python,等等。
sarices
2015-01-09 15:21:31 +08:00
@tini8 长连接不是连接池
楼主可以试试用swoole建立连接池
cevincheung
2015-01-09 15:26:05 +08:00
mysql: mysql-proxy、cobar、atlas
postgresql: pgbouncer、plproxy、slony

sql查询尽量不使用函数、外键(看场景)


foreach ($rows50万 as $item) $db->select(sql);

碰到这样的二逼程序员,数据库优化的再牛逼也没用。
babyname
2015-01-09 15:38:43 +08:00
我想问下这里的 webmaster 是傻逼吗?回复一个调侃php是世界上最好的语言帖子,不但删除帖子还封闭账号。
flash866
2015-01-09 15:49:11 +08:00
@sarices 为啥不能弄一个类似的内置进去?
msg7086
2015-01-09 15:50:21 +08:00
@babyname 请勿劫持&Spam,谢谢。
msg7086
2015-01-09 15:51:28 +08:00
@flash866 上面解释过了。PHP就是设计成这样的。
如果内置一个进去,势必会破坏现有的设计结构,PHP也就不是PHP了。
tomheng
2015-01-09 16:04:23 +08:00
个人觉得PHP亟待解决的问题有三个:效率、异步、并行。

都解决好了才能成为真正的世界上最好的语言。
kongkongyzt
2015-01-09 16:08:36 +08:00
php从本身的设计上来说就不能支持这样的方式
anewg
2015-01-09 16:44:45 +08:00
@tomheng 放弃兼容性大刀阔斧的改有可能做到,但就phpng来看还是兼容之前版本代码,效率有很大提升,后面两个就算了吧
Actrace
2015-01-09 18:29:30 +08:00
@tomheng
请在php.net搜索搜索 cli pthread pcntl
zts1993
2015-01-09 19:39:38 +08:00
因为实在是太简单,一个页面生命周期实在是太短了。。。。。所以得上memcache或者redis
leonlu
2015-01-10 08:54:13 +08:00
php(不包括扩展)是使用进程做为最基础的调度单元的:

1. 一个请求, 新建一个php进程.
2. 一个进程里, 也只有一个线程.
3. 一个请求处理完成自动释放进程.

所以, 如果在一个请求里, 先搞一个数据库连接池, 请求结束再释放掉它, 成本太高了. php语言的设计者认为多线程是不安全的...异步编程是反人类的...所以他们把php设计成了这样的语言...
mingzepeng
2015-01-10 10:51:16 +08:00
php作者设计php的初衷就是为了开发个人网站的,所以一开始并没有考虑那么多,而后期的不断升级也都是向下兼容的,而因为这种内嵌网页式的代码书写方式,还是被很多人吐槽为模板语言,至今很多人也并不承认php是一门独立的语言,不过这也并不影响它的流行。

一般来说说,连接池技术,php在做网站开发的时候,因为其语言的执行机制,执行一遍然后销毁所有内存,所以确实是无法像java,ruby,python一样,从语言层面建立一个连接池,但可以通过第三方实现。

而目前的大公司,访问量达到了一定的级别,通常的做法都是将各类服务封装为api,由php去调用,然后生成页面,而那些服务为了达到高性能,一般会才用java,c去开发,每个语言都有适合自己的地方。
zzcworld
2015-01-10 13:35:13 +08:00
请看react项目,可以让php变成node
hitsmaxft
2015-01-10 23:29:16 +08:00
mysqli 支持进程间链接重用的,看文档仔细点, 比如一个进程重用 200次,跟连接池也没啥区别, 因为fpm 本身就是池化管理的。 有时候并不是一定需要一种大伙都用的的方式才叫好。

『还是一请求一线程,用完销毁,下次再重新连接』 不成立

@leonlu php-fpm 能实现进程复用的, 并不是服务完毕就销毁的。


实现得好好的你们都不知道的, 还在这抱怨别人用做, 太让人心寒了吧。。
hitsmaxft
2015-01-10 23:29:47 +08:00
更正 : 还在这抱怨别人用做 => 还在这抱怨别人不做
leonlu
2015-01-10 23:42:09 +08:00
@hitsmaxft php-fpm怎么做到的进程复用? 求指导...

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

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

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

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

© 2021 V2EX