PHP 的 PDO 持久化连接重用,会不会有安全问题? 用 PDO 持久化,而不是连接池性能会有下降吗?

2017-05-20 18:49:33 +08:00
 xiaoyanbot

http://www.365mini.com/page/php-persistent-connection.htm

这篇文章里:

在 PHP 中,我们使用 new PDO()语句创建一个数据库连接,当连接数据库成功后,将会得到一个 PDO 类的实例,此连接在 PDO 对象的生存周期中保持活动。要想关闭连接,需要销毁对象以确保所有剩余到它的引用都被删除,可以赋一个 NULL 值给对象变量。如果不明确地这么做,PHP 在脚本结束时会自动关闭连接。

不过,当我们创建的数据连接为 PDO 持久化连接时,该连接在使用完毕或者 PHP 脚本结束后并不会被关闭,而是被 PHP 缓存起来。当另一个使用相同凭证(主机、端口、数据库名、用户名、密码等信息完全一致)的 PHP 脚本请求建立连接时,PHP 将直接返回之前被缓存起来的连接,从而达到连接重用。持久连接缓存可以避免每次访问数据库都要建立一个新连接的开销,从而让 web 应用程序更快。

也就是说,数据库的凭证基本上肯定是一样的,所有的用户都重用一个数据库链接, 大量用户都来的时候,会不会带来性能下降?

是不是 链接池 才是更高性能的

5113 次点击
所在节点    PHP
2 条回复
iyaozhen
2017-05-20 19:15:02 +08:00
你可以当长连接理解。如果你是常驻进程的话确实是很多请求过来用同一连接,但是 PHP 基本都是阻塞的,一个个请求也只会挨个处理,也就是和数据库的
连接,最多就一个请求在用。

还有在 php-fpm 运行模式下,这个参数基本没啥用。

你要高并发的话有好几种模型,异步单线程、多进程、多线程、协程,不过对于 PHP 的话还是多进程吧。

最后,楼主提问好广泛啊😂。
OpenYanxi
2017-05-20 19:22:37 +08:00
PHP 手册:

Warning:
在使用持久连接时还有一些特别的问题需要注意。例如在持久连接中使用数据表锁时,如果脚本不管什么原因无法释放该数据表锁,其随后使用相同连接的脚本将会被持久的阻塞,使得需要重新启动 httpd 服务或者数据库服务。另外,在使用事务处理时,如果脚本在事务阻塞产生前结束,则该阻塞也会影响到使用相同连接的下一个脚本。不管在什么情况下,都可以通过使用 register_shutdown_function() 函数来注册一个简单的清理函数来打开数据表锁,或者回滚事务。或者更好的处理方法,是不在使用数据表锁或者事务处理的脚本中使用持久连接,这可以从根本上解决这个问题(当然还可以在其它地方使用持久连接)。

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

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

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

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

© 2021 V2EX