简单的PHP脚本使用290Mb内存-为什么


Simple PHP script using 290Mb memory - why?

我有一个简单的PHP脚本作为cron作业运行,它的目的是检查网页的标题,并报告各种项目是否发生了变化。

我过去使用过这个脚本的各种版本,它一直运行良好,但现在我在一个服务器上使用它,当脚本使用超过100Mb的内存时(当然除了白名单脚本),该服务器会通过电子邮件发出警告,令人惊讶的是,我的头部检查脚本偶尔会报告大量内存使用,每天至少报告几次。

脚本每5分钟运行一次,内存问题每天发生5到6次——它似乎能自行解决,但我想阻止它偶尔为这样一项简单的工作使用这么大的内存。

警告电子邮件报告这个简单脚本的使用量约为290Mb:

<?php
  $message = "";
  function array_find ($needle, $haystack, $search_keys = false) { 
    if (!is_array($haystack)) return false;
    foreach ($haystack as $key => $value) {
      $what = ($search_keys) ? $key : $value;
      if (strpos($what, $needle) !== false) return $key;
    }
    return false;
  }
  $url = 'http://www.EXAMPLE.com/';
  $haystack = get_headers($url);
  $needle = "PHPSESSID";
  if (!((array_find($needle, $haystack)) != '')) {
    $message .= "No PHPSESSID in headers";
  }
  if (!(strpos($haystack[0], '200'))) {
    $message .= "No 200 OK";
  }
  if ($message != '') {
    mail("example@example.com", "Headers Changed", $message, "From: Example <example@example.com>");
  }
  exit;
?>

服务器是一个运行CENTOS 5.8、Apache 2.2.16、PHP 5.3.3 的VPS

感谢您的帮助。

也许你一天只吃5到6次大草垛?

PHP是一个渴求内存的野兽。这是事实。当处理相对较大的数据数组时,内存消耗可能不仅仅是显而易见的。

有一篇有趣的文章,名为"PHP数组(和值)有多大?(提示:big!)",强烈推荐阅读!

也许可以在每个主要部分之后尝试执行memory_get_usage()。这应该有助于你缩小范围。

尝试只使用get_headers($url)和memory_get_usage()创建一个文件,然后查看结果。。。

<?php 
$url = "http://www.example.com";
get_headers($url);
echo memory_get_usage();
?>

根据我的经验,PHP>=5上的get_headers()占用了大量内存。您可以查看文章"get_headers()函数导致内存泄漏"

PS:您还可以使用xDebug跟踪脚本的内存使用情况