所以我有一个脚本执行以下操作:
for ($i = $start;$i<=$end;$i++){
shell_exec("php /home/mysql_box/script.php phrases $i {$argv[3]} > /dev/null 2>&1 &");
}
在我的一台服务器上,我希望这个脚本运行400次。作为调用的一部分,它连接到另一个盒子上的Mysql服务器,但是出于某些奇怪的原因,大约有130个连接,然后错误说“#34; Mysql服务器已经消失了#34;”。
我很欣赏这是非常常见的MySQL手册说明:
您也可以在分叉子进程的应用程序中遇到此错误,所有这些应用程序都尝试使用与MySQL服务器相同的连接。通过为每个子进程使用单独的连接可以避免这种情况。
但是我肯定不会使用相同的连接吗?我的wait_timeout
是默认值 - 但是很大,为什么有些连接根本无法连接?
手册中的其他几点:
我希望我已经提供了足够的信息来帮助。
答案 0 :(得分:0)
您正在生成400个php进程并让它们在后台运行。拥有超过130个并发连接可能对您的MySQL服务器处理起来很困难。
您可能需要稍等一下才能启动所有这一过程:
(~~) :: (Num a, Ord a) => a -> a -> Bool
x ~~ y = abs (x-y) <= 1 -- if the Int definition was slightly off, OR
x ~~ y = x /= y && abs (x-y) <= 1 -- if the RealFloat definition was slightly off
答案 1 :(得分:0)
我认为在for
循环中调用的脚本几乎同时触发400个查询本身是一个坏主意。
即使每个查询花费很少的时间来执行循环也会更快。
您可以在运行mysql的服务器上点击允许连接集的最大数量:max_connections
。我不是100%确定这是你遇到的问题,因为通常你会得到的错误是Too many connections
:见Too many connections
您还可以达到目标服务器允许的最大网络连接数(这更有可能导致Mysql server has gone away
)
另外,考虑每个运行PHP解释器的进程一次产生400个进程。对本地服务器来说相当沉重。
最快的脏修复是在脚本调用之间设置一些延迟。
for ($i = $start;$i<=$end;$i++){
shell_exec("php /home/mysql_box/script.php phrases $i {$argv[3]} > /dev/null 2>&1 &");
usleep( 1000 * 1000 * 100 ); // 0.1 SECS
}
然而,这导致了你与“同步”的方法,这可能不是你想要的。
正确的解决方案是实现一个系统,以了解生成的脚本何时结束。然后开始并行运行脚本,但避免超过ex。 50同时运行。
您可以考虑直接在PHP脚本中实现多线程,请参阅:
如果“轻轻地点击服务器轻轻地”(你甚至可以尝试作为问题隔离策略来运行高延迟或同步的脚本)并不能解决问题(但你< strong>应一次发出更少的查询无论如何在我看来)然后问题属于MySQL server has gone away类别。
我引用链接的文档可能是我认为的原因(完整列表转到上面的ht elink)
- 您尝试在关闭与服务器的连接后运行查询。这表示应该更正应用程序中的逻辑错误。
- 在不同主机上运行的客户端应用程序没有从该主机连接到MySQL服务器的必要权限。
- 您在服务器端遇到超时,并且客户端中的自动重新连接被禁用(MYSQL结构中的重新连接标志等于0)。
- 如果使用--skip-networking选项启动MySQL,您可能还会看到MySQL服务器已经消失。
答案 2 :(得分:0)
所以我相信我已经发现了这个问题,我希望这有助于其他任何人。原因是每个循环上运行的初始查询花费了大约15秒。由于某种原因,这减少了并发新连接的数量,因此崩溃了。因此,解决方案是减少所需的查询时间,因此如果您遇到此问题 - 请自行处理查询。