MySQL连接限制和PHP MySQL连接

问题描述:

我有一个令人沮丧的问题。我的网络服务有一个电子邮件到php模块。简而言之,一旦我的用户向他的专用电子邮件地址发送电子邮件,我的邮件服务器就会捕获该电子邮件,并将其管理到我的服务器上运行的PHP脚本。这个PHP脚本打开一个MySQL连接并将电子邮件内容保存到数据库中。MySQL连接限制和PHP MySQL连接

到目前为止这么好。一旦超过了/etc/my.cnf中设置的MySQL连接限制,问题就会发生。它被设置为500.如果500个或更多的用户同时发送电子邮件,我的MySQL无法处理新的连接。

你有什么建议?我应该使用持续的MySQL连接还是其他任何方法,如将收到的电子邮件内容写入txt文件,然后使用cron作业将它们保存到数据库中?

感谢您的建议!

另一个建议是像守护进程一样运行PHP脚本,它只连接到DB一次,并等待输入在无限循环中处理。

+0

是的,这似乎是一个好主意,PHP脚本将从管道获取电子邮件,保存到一个txt文件和守护进程PHP脚本将监视“拾取”目录并使用单一连接将数据保存到数据库。谢谢。 – TamTam 2010-07-29 19:12:26

为什么不提高连接限制,以您所期望的并发用户数量?

OR

有轻微的延迟或重试周期,其中它会尝试,如果失败再次连接。

+1

我认为你的第二个建议可能是最好的 - 创建一个存储数据的PHP对象队列。每隔一段时间,检查队列并尝试将其写入数据库。如果失败,请将其放回队列中。 – 2010-07-28 00:10:52

+0

托马斯,这些PHP对象将被存储在哪里?如果PHP脚本每次打开数据库连接,我猜它会在每次尝试后都会死掉 - 所以队列只能在邮件服务器端使用。 – Qwerty 2010-07-28 00:15:38

我在我运行的网站上有类似的功能。不要将电子邮件输送到脚本,而是在给定时间无法控制将交付多少封电子邮件的情况下,设置一个cron。这个cron可以按你喜欢的频率运行。它可以连接到邮件服务器,读取尽可能多的邮件,并保持与MySQL的单一连接。

这也将大大有助于你遇到邮件轰炸事件。

+0

感谢您的建议,但我们一次收到超过10,000封电子邮件,因此pop3效率不高。直接管道到PHP脚本对我们来说更加可行。 – TamTam 2010-07-29 19:11:27

+0

我不认为我提到过pop3,我也不认为你做过。无论哪种方式,cron都可以处理尽可能多的邮件,并根据需要频繁运行。你甚至可以看中并实现类似Gearman的东西来并行化邮件处理,同时仍然可以控制这些进程占用多少资源。 – 2010-07-30 00:48:12

如果500个或多个用户在同一时间

嗯发送电子邮件。在计算机系统上“同时”发生两个事件是非常不寻常的,但频繁发生的过程会重叠。我希望你能在优化电子邮件处理程序方面获得很多里程碑。但是你没有提供如何工作的细节。你不是说这是运行的操作系统。

我建议你检查是否没有过度使用CPU或内存的迹象(注意你希望免费使用大约80%的内存)。如果处理程序为每条消息启动一个PHP实例,那么这是一个主要开销 - 但这不会影响mysql连接打开的时间。

如果您可以避免它,请不要使用Blobs/Clobs - 将数据转储到磁盘文件并从数据库中引用它。

应用所有常用的性能调整步骤(优化物理存储层 - 例如RAID,数据库调整)。

整理脚本运行的所有数据库交互,并在一个块中运行它们,并使用db连接和关闭语句括起来。

如果你不能同步处理音量,那么... 不要重新发明轮子,不要实现自己的排队系统来处理消息 - 直接将消息发送到maildir或邮箱并运行守护进程轮询内容并处理它。现成的MDAs比使用PHP更有效率。

C.