V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xiaoyanbot
V2EX  ›  PHP

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

  •  
  •   xiaoyanbot · 2017-05-20 18:49:33 +08:00 · 5212 次点击
    这是一个创建于 2746 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    这篇文章里:

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

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

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

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

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

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

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

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

    Warning:
    在使用持久连接时还有一些特别的问题需要注意。例如在持久连接中使用数据表锁时,如果脚本不管什么原因无法释放该数据表锁,其随后使用相同连接的脚本将会被持久的阻塞,使得需要重新启动 httpd 服务或者数据库服务。另外,在使用事务处理时,如果脚本在事务阻塞产生前结束,则该阻塞也会影响到使用相同连接的下一个脚本。不管在什么情况下,都可以通过使用 register_shutdown_function() 函数来注册一个简单的清理函数来打开数据表锁,或者回滚事务。或者更好的处理方法,是不在使用数据表锁或者事务处理的脚本中使用持久连接,这可以从根本上解决这个问题(当然还可以在其它地方使用持久连接)。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3514 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 11:23 · PVG 19:23 · LAX 03:23 · JFK 06:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.