http://www.365mini.com/page/php-persistent-connection.htm
这篇文章里:
在 PHP 中,我们使用 new PDO()语句创建一个数据库连接,当连接数据库成功后,将会得到一个 PDO 类的实例,此连接在 PDO 对象的生存周期中保持活动。要想关闭连接,需要销毁对象以确保所有剩余到它的引用都被删除,可以赋一个 NULL 值给对象变量。如果不明确地这么做,PHP 在脚本结束时会自动关闭连接。
不过,当我们创建的数据连接为 PDO 持久化连接时,该连接在使用完毕或者 PHP 脚本结束后并不会被关闭,而是被 PHP 缓存起来。当另一个使用相同凭证(主机、端口、数据库名、用户名、密码等信息完全一致)的 PHP 脚本请求建立连接时,PHP 将直接返回之前被缓存起来的连接,从而达到连接重用。持久连接缓存可以避免每次访问数据库都要建立一个新连接的开销,从而让 web 应用程序更快。
也就是说,数据库的凭证基本上肯定是一样的,所有的用户都重用一个数据库链接, 大量用户都来的时候,会不会带来性能下降?
是不是 链接池 才是更高性能的
1
iyaozhen 2017-05-20 19:15:02 +08:00 via Android
你可以当长连接理解。如果你是常驻进程的话确实是很多请求过来用同一连接,但是 PHP 基本都是阻塞的,一个个请求也只会挨个处理,也就是和数据库的
连接,最多就一个请求在用。 还有在 php-fpm 运行模式下,这个参数基本没啥用。 你要高并发的话有好几种模型,异步单线程、多进程、多线程、协程,不过对于 PHP 的话还是多进程吧。 最后,楼主提问好广泛啊😂。 |
2
OpenYanxi 2017-05-20 19:22:37 +08:00
PHP 手册:
Warning: 在使用持久连接时还有一些特别的问题需要注意。例如在持久连接中使用数据表锁时,如果脚本不管什么原因无法释放该数据表锁,其随后使用相同连接的脚本将会被持久的阻塞,使得需要重新启动 httpd 服务或者数据库服务。另外,在使用事务处理时,如果脚本在事务阻塞产生前结束,则该阻塞也会影响到使用相同连接的下一个脚本。不管在什么情况下,都可以通过使用 register_shutdown_function() 函数来注册一个简单的清理函数来打开数据表锁,或者回滚事务。或者更好的处理方法,是不在使用数据表锁或者事务处理的脚本中使用持久连接,这可以从根本上解决这个问题(当然还可以在其它地方使用持久连接)。 |