我有一个简单的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跟踪脚本的内存使用情况