2011-02-09 16 views
1

我在Windows Server 2008平台上使用MySQL社区服务器5.5和PHP 5.3.3。 我已经设置了每个用户的资源限制,特别是与DB用户在一个小时内运行的查询相关的限制。我已经阅读过这份文件,它非常有趣,但总是不适合我。当通过PHP运行MySQL查询时,“max_questions”限制不受尊重

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

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

ERROR 1226 (42000): User 'user' has exceeded the 'max_questions' resource (current value: 7)

这是上面的通缉行为。

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

PS:“用户”只拥有SELECT,INSERT,UPDATE,DELETE特权,并在PHP代码没有任何SQL代码为FLUSH USER_RESOURCES用户“用户”不可能跑(因为RELOAD权限没有分配给用户)

在此先感谢

+0

你是否仅限制`user @ localhost`而不是`user @ host-your-php-code-runson`? – 2011-02-09 10:19:14

+0

为什么你需要这种奇怪的限制? – 2011-02-09 10:28:52

回答

0

我认为你正在做的小辫子,

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

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

请尝试我的上述技巧,让我知道你是否仍然有问题?

快乐编码....

0

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

MAX_CONNECTIONS_PER_HOUR !=0 
MAX_USER_CONNECTIONS !=0; 

例如:仅当包括MAX_QUERIES_PER_HOUR部件查询还包括不同于0以下元件中的一个发生

问题下面授予的查询永远不会导致相关的查询错误消息限制成就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页面能够执行他们想要的所有查询。否则,限制被理解并且消息

has exceeded the 'max_questions' resource

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

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

1

检查这篇文章中,

多少用户,你用相同的名字你的mysql有..(记住,不仅名字,但其中permited连接的用户在MySQL中指定的主机)。 **很重要。

用户@%
[email protected]
用户@本地
[email protected]

他们每个人都是不一样的,如果您有任何限制规则你喜欢使用,因此,无论您想要进行限制,您都必须为用户@指定限制。 (所有人,如果你有问题**认为是你的情况)。

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