总结
简要建议(更详细的信息请参见答案)
为避免内存泄漏,您可以:
- 一旦变量变得无用,就立即取消设置它们
- 您可以使用xdebug获取函数的内存消耗详细报告并查找内存泄漏
- 您可以设置memory_limit(例如为5Mb),以避免虚拟内存分配
问题
除库和变量之外,PHP可以使用内存来做什么?我通过这段代码监视变量使用的内存,结果大约为3Mb:
$vars = array_keys(get_defined_vars());
$cnt_vars = count($vars);
$allsize = 0;
for ($j = 0; $j < $cnt_vars; $j++) {
try
{
$size = @serialize($$vars[$j]);
$size = strlen($size);
}
catch(Exception $e){
$str = json_encode($$vars[$j]);
$str = str_replace(array('{"','"}','":"','":'), '', $str);
$size = strlen($str);
}
$vars[$j] = array(
'size' => $size,
'name' => $vars[$j]
);
$allsize += $size;
}
库文件(例如libcurl等)占用大约18MB的空间。因此总共是21MB,但是
pmap -x (进程名) 显示总内存占用量为kB:314028 RSS:74704 Dirty:59672
因此,实际内存消耗总共约为74MB。 我还看到一些在pmap中具有[anon]映射的大块。PHP用这些块做什么?
PHP版本:5.5.9-1ubuntu4.14 PHP扩展:
root@webdep:~# php -m
[PHP Modules]
bcmath
bz2
calendar
Core
ctype
curl
date
dba
dom
ereg
exif
fileinfo
filter
ftp
gd
gettext
hash
iconv
json
libxml
mbstring
mcrypt
mhash
openssl
pcntl
pcre
PDO
pdo_pgsql
pgsql
Phar
posix
readline
Reflection
session
shmop
SimpleXML
soap
sockets
SPL
standard
sysvmsg
sysvsem
sysvshm
tokenizer
wddx
xml
xmlreader
xmlwriter
Zend OPcache
zip
zlib
[Zend Modules]
Zend OPcache
kcachegrind
这样有用的工具来分析。 - Smarmemory_get_usage()
和memory_get_usage(true)
进行测试。 - Daniel W.