摘要
简短的建议(来自更多数据信息,请参阅答案)
为避免内存泄漏,您可以:
- 当变量变得无用时立即取消设置
- 您可以使用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;
}
和库需要〜18Mb(libcurl等) 所以总共有 21 Mb,但是
pmap -x (process) shows, that total memory consumption is kB: 314028 RSS: 74704 Dirty: 59672
因此,实际总消耗量约为 74Mb。 我还在我的 pmap 中看到一些带有 [anon] 映射的大块 什么 PHP 使用这个 block ?
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
最佳答案
PHP 与编译为单个二进制文件的 C 或 CPP 代码不同。您的所有脚本都在 Zend 虚拟机中执行。而且大部分内存都被VM本身消耗掉了。这包括加载的扩展使用的内存、PHP 进程使用的共享库(.so 文件)和任何其他共享资源。
我不记得确切的来源,但我在某处读到,将近 70% 的总 CPU 周期被 PHP 内部消耗,只有 30% 进入您的代码(如果我在这里错了,请纠正我)。这与内存消耗没有直接关系,但应该让您了解 PHP 的工作原理。
关于匿名 block ,我在另一个 SO 答案中找到了一些细节。答案是关于 Java,但同样适用于 PHP。
Anon blocks are "large" blocks allocated via malloc or mmap -- see the manpages. As such, they have nothing to do with the Java heap (other than the fact that the entire heap should be stored in just such a block).
这是 SO 答案的实际链接 https://stackoverflow.com/a/1483482/1012809
查看这篇文章了解更多关于匿名内存页面 (anon) 的信息 https://techtalk.intersec.com/2013/07/memory-part-2-understanding-process-memory/
还可以查看此幻灯片分享以获取有关 PHP 内存管理的更多详细信息 http://www.slideshare.net/jpauli/understanding-php-memory
我建议禁用一些扩展。这应该会为您节省一些未使用的内存。
关于php - php进程的内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35476889/