【问题标题】:Server memory spikes after a few calls to simple PHP script几次调用简单的 PHP 脚本后服务器内存激增
【发布时间】:2012-11-16 13:30:51
【问题描述】:

在尝试调试不同的问题时,我创建了一个包含以下内容的 HTML 文件:

<body>
Try 1:<iframe style='height:60px;' src='return_test1.php' ></iframe><br/>
Try 2:<iframe style='height:60px;' src='return_test2.php' ></iframe><br/>
Try 3:<iframe style='height:60px;' src='return_test3.php' ></iframe><br/>
Try 4:<iframe style='height:60px;' src='return_test4.php' ></iframe><br/>
Try 5:<iframe style='height:60px;' src='return_test5.php' ></iframe><br/>
Try 6:<iframe style='height:60px;' src='return_test1.php' ></iframe><br/>
Try 7:<iframe style='height:60px;' src='return_test2.php' ></iframe><br/>
Try 8:<iframe style='height:60px;' src='return_test3.php' ></iframe><br/>
Try 9:<iframe style='height:60px;' src='return_test4.php' ></iframe><br/>
Try 10:<iframe style='height:60px;' src='return_test5.php' ></iframe><br/>
</body>

每个脚本(return_test1.phpreturn_test5.php)只包含以下代码:

<?php
echo "SUCCESS";
?>

问题是打开 HTML 文件时,一些 iframe 会显示预期的“SUCCESS”输出,但其他会显示“Internal Server Error”。这些随着页面的每次刷新而变化。

查看 cPanel 服务器日志,出现错误“无法分配内存:无法创建子进程”。查看资源统计信息,打开 HTML 文件时使用的内存高达 1 GB。

我在其他服务器上尝试了代码,当然它运行没有问题。

我还应该提到,直接打开其中一个 PHP 脚本总是会产生良好的结果。它们只会在同时调用时失败。

该网站位于共享主机上,流量很少。提供托管服务的公司没有帮助,似乎唯一的解决方案是转移到另一个托管服务提供商。

有谁知道可能导致问题的原因?或者我可以建议托管人员检查服务器配置?

【问题讨论】:

    标签: php iframe


    【解决方案1】:

    我们最终更换了主机。

    更改后的一天,我们收到了旧主机商的消息,称他们在与 cPanel 和 cloudLinux 的制造商协商后解决了问题。显然,这是一个影响极少数用户的问题,并且已通过“资源管理部分”的自定义补丁修复(抱歉,我不知道确切的细节)。

    【讨论】:

      【解决方案2】:

      看来您的共享主机环境是个玩笑,赶快摆脱它们吧。如果他们不能保证你有足够的内存来生成 10 个进程,那就太可笑了。

      【讨论】:

      • 服务器似乎可以毫无问题地运行 Wordpress。我发现这个问题只是因为 TimThumb 没有工作(我有一个页面,其中有多个由 TimThumb 生成的缩略图,其中一些没有工作)。
      • 我联系了他们,他们说 TimThumb 使用了太多内存……这就是我使用非常简单的脚本进行此测试的方式。但 Wordpress 运行良好,我想它使用的资源比我的小测试要多。
      • 如果您有 ssh 访问权限,请查看 (h)top 对内存和 CPU 饱和度的评价。我非常有信心他们已经用完了他们的机器。
      【解决方案3】:

      您的主机可能限制了您可以同时运行的进程/内存数量。在您的示例中,服务器同时创建了 11 个 PHP 进程。并且不同的 PHP 进程之间不共享内存:每个进程使用 X 兆字节并达到内存限制。

      您的托管解决方案似乎(非常)有限。但是,如果您不想或无法更改,您可以处理您的脚本逻辑。

      例如,使用这种解决方案,您将只使用一个进程:

      <body>
      Try 1:<div style="height:60px; overflow: auto;"><?php require('return_test1.php'); ?></div>
      Try 2:<div style="height:60px; overflow: auto;"><?php require('return_test2.php'); ?></div>
      Try 3:<div style="height:60px; overflow: auto;"><?php require('return_test3.php'); ?></div>
      <!-- ... etc ... -->
      </body>
      

      【讨论】:

      • 我真的做不到。问题源于尝试使用 TimThumb 生成缩略图。而且我需要将 TimThumb 脚本作为 IMG 标签的 SRC 属性...我想我们只需要更改主机。
      • 更改主机:我认为这也是最好的解决方案 :) 另一种方法可以生成您需要的所有拇指,当图像被上传或通过在 cron 中调用 TimThumb 脚本,并写入结果(图像)文件中,以便在显示网页时不调用 TimThumb 脚本 X 次。但是更换主机会减少“时间成本”;)
      猜你喜欢
      • 2012-07-13
      • 2012-06-22
      • 2010-10-06
      • 2014-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多