启动多个PHP进程

时间:2018-02-27 14:16:55

标签: php mysql

所以我有一个脚本执行以下操作:

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是默认值 - 但是很大,为什么有些连接根本无法连接?

手册中的其他几点:

  1. 连接使用IP非主机名
  2. 我没有使用skip-networking启动mysql
  3. 查询是一个单一的班轮 - 它不大
  4. 我正在使用Ubuntu
  5. 我正在与PDO联系
  6. 我希望我已经提供了足够的信息来帮助。

3 个答案:

答案 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脚本中实现多线程,请参阅:

PThreads / PHP PThreads

PHPThread

GPhpThread

如果“轻轻地点击服务器轻轻地”(你甚至可以尝试作为问题隔离策略来运行高延迟或同步的脚本)并不能解决问题(但你< strong>应一次发出更少的查询无论如何在我看来)然后问题属于MySQL server has gone away类别。

我引用链接的文档可能是我认为的原因(完整列表转到上面的ht elink)

  
      
  • 您尝试在关闭与服务器的连接后运行查询。这表示应该更正应用程序中的逻辑错误。
  •   
  • 在不同主机上运行的客户端应用程序没有从该主机连接到MySQL服务器的必要权限。
  •   
  • 您在服务器端遇到超时,并且客户端中的自动重新连接被禁用(MYSQL结构中的重新连接标志等于0)。
  •   
  • 如果使用--skip-networking选项启动MySQL,您可能还会看到MySQL服务器已经消失。
  •   

答案 2 :(得分:0)

所以我相信我已经发现了这个问题,我希望这有助于其他任何人。原因是每个循环上运行的初始查询花费了大约15秒。由于某种原因,这减少了并发新连接的数量,因此崩溃了。因此,解决方案是减少所需的查询时间,因此如果您遇到此问题 - 请自行处理查询。