【问题标题】:PHP script generating too many MySQL connectionsPHP 脚本生成太多 MySQL 连接
【发布时间】:2013-04-27 04:38:10
【问题描述】:

我有一个脚本,每 5 分钟检查几个 twitch 频道,所以我可以在我的网站上列出我想要的当前直播的流。

问题是,这个脚本生成了很多 mysql_connections,我收到了一些关于最大连接数限制的错误。

据我所知,如果我打开一个到 mysql 的连接并在我的脚本上运行多个查询,它仍然是一个连接,对吧?

我的脚本是这样的:

1) 连接数据库

2) 查看当前时间

3) 使用站点任务更新表的 mysql 查询,插入当前时间

4) 对流媒体列表表的mysql查询

5) 对于每条记录,它会在 twitch 上获取一个带有数据的 xml,并保存到数据库中,如果它是否在线,有多少观众等

6) mysql_close

有人知道为什么会这样吗?起初我以为这是另一个 GoDaddy 错误,但由于这仅在我运行此任务时发生,因此在检查之前我没有费心与他们交谈。

【问题讨论】:

  • 如果你能发布一些你的代码会更好
  • 得到太多连接错误意味着很可能,你没有做 mysql_close 足够:P 你每 5 分钟是什么意思?这对于纯 php 是不可能的。如果你做一个mysql_connect,你应该做一个mysql_close。在两者之间,你是对的,这是你所做的所有查询的一个连接。
  • 因为我有很多浏览量,所以我有一个脚本可以检查包含一些任务的表格,如果需要,它会运行脚本以获取 twitch 上的流。 $query = mysql_query("select * from site_tasks_helper"); $rs = mysql_fetch_array($query); $streams_last_verified = $rs["streams_last_verified"]; if (time() > strtotime("+5 分钟", $streams_last_verified)) { exec("/web/cgi-bin/php5 -f /var/chroot/home/content/57/8793357/html/lib/update_streams .php > /dev/null &", $arrOutput ); }

标签: php mysql connection


【解决方案1】:

在 php.ini 中尝试持久连接,http://php.net/manual/en/mysql.configuration.php 另外,由于您将使用持久性,并且下一个脚本的实例可能会重用此连接,因此您可能希望避免 mysql_close

【讨论】:

  • 如果我理解正确的话,mysql_pconnect 在脚本结束时保持连接处于活动状态,是这样吗?我现在正在使用 mysql_connect。
  • mysql_connect() 是建立与/到 mysql 服务器的连接的正确命令,只需确保您没有使用“new_link”参数,尽管我认为 PHP 正在与每个脚本实例。如果持久连接不能解决您的问题,那么您可以尝试:mysql_close($link); $链接=空; // 清除这个变量并强制关闭。
  • 我只连接一次,在脚本开始时。函数是这样的: function ConectToDB() { $conex_site = mysql_connect(server, user, password); mysql_select_db(数据库);返回$我的连接; }
  • 我刚刚意识到... Apache 是一个多进程 Web 服务器,这意味着他将为每个脚本实例创建另一个工作进程,这当然会创建另一个连接到数据库。尝试使用 mysql_pconnect() 或 mysqli_connect(p:$host)。您是否有机会访问 apache 配置文件?
  • 我没有,我在 GoDaddy 上使用共享帐户。真正奇怪的是,这个脚本每 5 分钟只运行一次,所以我真的不认为有多少人在使用它。
【解决方案2】:

在脚本顶部使用include_once ('connectdb.php');connectdb.php 应该是您在评论中所写的内容。

connectdb.php

$conex_site = mysql_connect(server, user, password); mysql_select_db(database); 

编辑 1:

<?php

    $MyConnection = mysql_connect(server, user, password) or die(mysql_error());
    mysql_select_db(database) or die(mysql_error());
    return $MyConnection;//or return true;
}
?>
------------ mysql_connect.php -------------

------------ update_streams.php ------------
<?php
$con=include_once('mysql_connect.php');//or just include once('mysql_connect.php');

【讨论】:

  • @PauloManrique 您如何管理每 5 秒调用一次 .php 程序?使用 javascript settimeout()?请输入您的代码
  • 我每 5 分钟打一次电话,而不是每 5 秒打一次电话。我只有一个函数检查上次检查的时间是什么时候,如果超过 5 分钟,那么它会调用脚本。 pastebin.com/hu2q4Fyr
  • 如何管理每 5 或 x 分钟调用一次函数?还有你的代码mysql_connect() 在哪里?
  • 这部分脚本运行在网站的每个页面上,因为我有很多访问者。我的 mysql_connect() 在这个脚本上:pastebin.com/uMsjWLdM
  • require_oncephp连接文件,但是每次都调用main函数进行连接。我不明白你为什么要使用这种电话。我编辑了我的答案。看看有没有用
【解决方案3】:

编辑my.cnf 配置文件。在 CentOS、RedHat 和类似的发行版上,这是/etc/my.cnf;其他发行版会将其存储在其他地方。

[mysqld] 部分下添加以下设置:

max_connections = 200

现在当你下次重新启动 MySQL 时,它将使用此设置而不是默认设置。

200 是您指定的大于现有编号的数字。因此,假设当前设置为 100,您可以设置更高的数字。

此外,如果您对 MySQL 具有 root/admin 访问权限,那么您可以发送以下命令来即时增加最大连接,直到服务器重新启动。

set global max_connections = 200;

请注意,增加可建立的连接数将增加 MySQL 运行所需的潜在 RAM 量。谨慎增加 max_connections 设置!

【讨论】:

  • 我无法访问 my.cnf,因为它是 GoDaddy 上的共享主机。我很确定不是限制,最大连接数为 1000,最大用户连接数 = 200
猜你喜欢
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
  • 2017-12-27
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
相关资源
最近更新 更多