Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过PHP的mysql连接瓶颈_Php_Mysql_Connection - Fatal编程技术网

通过PHP的mysql连接瓶颈

通过PHP的mysql连接瓶颈,php,mysql,connection,Php,Mysql,Connection,目前,我们正在$u会话中恢复MySQL连接,以节省建立MySQL连接的往返时间 但问题是连接的数量很快就超过了限制 那么你们的解决方案是什么 您是否每次都创建一个新连接,并在使用后关闭该连接,或者像我一样恢复该连接?我会在每次新页面调用中设置一个新连接。我会在整个页面中使用1连接,并在页面发送到浏览器时将其关闭 我怀疑你优化得太早,给自己带来了不必要的痛苦。PHP在连接池方面确实缺乏,这是其他语言/框架中非常常见的概念 使用mysql\u pconnect,您可以走得更远。将连接存储在会话中听起

目前,我们正在$u会话中恢复MySQL连接,以节省建立MySQL连接的往返时间

但问题是连接的数量很快就超过了限制

那么你们的解决方案是什么


您是否每次都创建一个新连接,并在使用后关闭该连接,或者像我一样恢复该连接?

我会在每次新页面调用中设置一个新连接。我会在整个页面中使用1连接,并在页面发送到浏览器时将其关闭


我怀疑你优化得太早,给自己带来了不必要的痛苦。

PHP在连接池方面确实缺乏,这是其他语言/框架中非常常见的概念


使用mysql\u pconnect,您可以走得更远。将连接存储在会话中听起来是件非常糟糕的事情,因为这样会占用太多的资源。

将连接存储在会话中不应该起作用。不要那样做。如果它真的在后续访问中重用了该连接,我会感到惊讶,因为它涉及网络访问,并且您不能将网络连接存储在文件中!充其量,它会重新连接到下一个页面视图,这不会给您带来任何好处。在最坏的情况下,对于每个保持打开状态而未正确关闭的请求,您都有一个单独的连接

编辑-更多想法


此外,在优化的名义下,为什么还要麻烦呢?您是否确实分析了代码并发现这是真正的瓶颈?只需以最简单明了的方式编写代码,然后在发现实际问题时担心优化问题。除非您有一个非常大的站点,否则数据库连接不是任何瓶颈的来源。

继DGM的评论之后,
resource
类型(如MySQL连接引用)不会通过会话还原。使用
serialize()
$\u会话的内容进行序列化,并将其与会话ID一起存储,以便在会话再次启动时恢复

各国的文件:

字符串序列化(混合$value)

value——要序列化的值
serialize()
处理除
资源
类型之外的所有类型


这意味着您实际上正在重新连接每个请求。使用noselasd建议的
mysql\u pconnect()
可能会缓解这一问题。一定要注意上面的注释,尤其是这需要PHP作为一个模块运行的事实。

数据库连接对象是一种资源,这意味着它是PHP世界之外的神奇事物(比如c结构或对象)。您不能序列化资源,而在会话中存储变量意味着序列化它(与
serialize();
的做法相同)

php具有“不共享”的性质,这意味着它不与其他请求共享任何资源。2个请求可能都来自用户A,或者一个用户A和一个用户B,无法知道。每个请求都是封装的,在两个请求之间建立逻辑连接的唯一非常有限的“变通方法”是会话。其他一切都必须从外部抓取(数据库、文件、memcached),因此这不再是php的问题

正因为如此,在请求之间共享数据库资源从来就没有意义。每个请求都有自己的mysql\u连接。我认为这是mysql首先在php社区流行的主要原因。mysql的连接速度比其他rdbms快得多,因为它的功能更少(没有事务、没有视图、没有触发器、什么都没有),所以非常适合

mysql_pconnect实现了连接池(但在不同的级别上),但它也不是一根魔杖。现在你无论如何都应该使用PDO(而且PDO根本不支持它)

如果您的应用程序速度太慢,那么问题就出在其他地方

我的忠告是:
  • 不管你想做什么。。。你没有共享连接,所以请看一看。事实上,您的应用程序可能会因为您的技巧而变慢(如果它为每个查询创建连接)。删除该功能并再次测试
  • 检查您的查询(
    EXPLAIN SELECT*FROM foo;
  • 把你的指数弄对
  • 使用缓存(例如memcached)
我看到的最常见的绩效问题是那些认为他们应该寻找最常见的绩效问题的人,而不是通过测量来找出他们实际的绩效问题。
-


如其他答案所述,php无法在文本中存储资源,只是无法完成

如果您使用的是PHP5.3和mysqli,那么现在可以通过在连接“p://”时在主机参数前面加前缀来使用持久连接

使用mysql扩展,使用mysql\u pconnect


你可以设置一个mysql代理,也许

我遇到的问题是在数据库级别,而不是PHP,我认为使用mysql\u pconnect类似于将其恢复到$\u会话中,对吗?在$\u会话中使用它会将连接限制为只连接到该会话。这可能是巨大的浪费。使用mysql_pconnect允许任何人(无论会话如何)使用它。如果您使用连接的时间尽可能短,这将是一个巨大的胜利。如果使用mysql_pconnect,会不会导致并发问题?@noselasd:在会话中存储数据库连接资源不起作用,因此推测它是否加快了速度是没有意义的。@shore:不,通常pconnect是可以的,但是只有在某些情况下才会有性能提升。因为每3秒就有一个对服务器的ajax请求,所以我觉得有必要这样做。您在没有存储的情况下尝试过吗?这真的会引起问题吗?或者你是在解决你预期的问题吗?这是后一种情况,但我认为这是合理的。你可能在解决你没有的问题。我认为在你解决问题之前先找出你是否有问题是合理的。我现在有一个问题:为什么