通过PHP运行MySQL查询时,“max_questions”限制不受尊重

时间:2011-02-09 10:15:05

标签: php mysql resources limits

我在Windows Server 2008平台上使用MySQL社区服务器5.5和PHP 5.3.3。 我已经设置了每个用户资源限制,特别是与数据库用户在一小时内运行的查询相关的限制。我已经阅读了这份文件,它非常有趣但总是对我不起作用。

http://dev.mysql.com/doc/refman/5.5/en/user-resources.html

当我通过mysql命令行工具(mysql.exe)运行查询时,限制正常工作,如果每小时的查询限制为7,则在一小时内发出7次查询后,我收到错误:

  

ERROR 1226(42000):用户'用户'有   超出了'max_questions'资源   (现值:7)

以上是想要的行为。

当我通过PHP运行查询时(我以前连接到数据库的用户是相同的),查询限制不起作用:通过php的同一个用户可以运行它想要的所有查询而没有任何查询限制。如果我回到上面的mysql命令行,计数器似乎被重置(即使小时尚未过去):我也可以在一小时内运行7个查询。 我认为这不是通缉行为。似乎PHP重置计数器并且不会触发查询限制。

PS:'用户'只拥有SELECT,INSERT,UPDATE,DELETE个权限,而在PHP代码中,没有任何用户“用户”无法运行的FLUSH USER_RESOURCES SQL代码(因为{{ 1}}权限未分配给用户)

提前致谢

3 个答案:

答案 0 :(得分:1)

检查此提示,

你的mysql中有多少用户使用相同的名称..(不仅要记住名称,还要记住在mysql中指定用于连接用户的主机)。 **非常重要。

用户@%
user@127.0.0.1
用户@本地
user@172.35.20.12

如果您有任何限制规则,那么它们中的每一个都不相同,因此,您必须在任何您想要限制的地方为用户@分配限制。 (所有这些,如果你有问题**认为是你的情况)。

Recomendation:为WEB PHP创建一个特定用户(只能创建一个user @ host),而不是使用可能有多个user @host分配的通用用户。 像phpuser @'localhost'通常就足够了。

答案 1 :(得分:0)

我认为你没有做错,

请检查你的mysql_connect函数中的主机到php。 如果您的主机是IP地址,则需要将资源限制分配给用户名@ yourip或用户名@%

如果您正在通过命令行运行,那么您将从username @ localhost登录,并且您已将限制分配给同一用户。

请尝试我的上述技巧并告诉我你是否还有问题?

快乐的编码......

答案 2 :(得分:0)

我已经解决了(部分)问题。

仅当包含MAX_QUERIES_PER_HOUR组件的查询还包含以下与0不同的元素之一时,才会出现此问题:

MAX_CONNECTIONS_PER_HOUR !=0
MAX_USER_CONNECTIONS !=0;

e.g。以下授权查询不会导致与PHP中的查询限制成就相关的错误消息:

GRANT USAGE ON *.* TO 'user'@'localhost'
WITH MAX_QUERIES_PER_HOUR 20
MAX_UPDATES_PER_HOUR 10
MAX_CONNECTIONS_PER_HOUR 5
MAX_USER_CONNECTIONS 2;

相反,以下授权正常运行,MySQL正确应用限制。

GRANT USAGE ON *.* TO 'user'@'localhost'
    WITH MAX_QUERIES_PER_HOUR 20
    MAX_UPDATES_PER_HOUR 10
    MAX_CONNECTIONS_PER_HOUR 0
    MAX_USER_CONNECTIONS 0;

简而言之,当查询设置查询限制包含其中一个组件MAX_CONNECTIONS_PER_HOUR和MAX_USER_CONNECTIONS不同于0时,将忽略与MAX_QUERIES_PER_HOUR和MAX_UPDATES_PER_HOUR相关的限制:我的PHP页面可以执行他们想要的所有查询。否则,理解限制和消息

  

已超出'max_questions'资源

在查询限制成就事件发生时正确显示。

正如我上面所说,当我使用mysql命令行工具时,问题不会发生。它仅在通过PHP页面运行查询时发生。