СУЩНОСТЬ
Краткие рекомендации (из более подробной информации, см. ответы)
Чтобы избежать утечек памяти, вы можете:
- отменять переменные сразу, когда они становятся бесполезными
- вы можете использовать xdebug для подробного отчета о потреблении памяти по функциям и поиска утечек памяти
- вы можете установить memory_limit (например, до 5 МБ), чтобы избежать размещения фиктивной памяти
Вопрос
Для чего 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 Мб, но
pmap -x (процесс) показывает, что общее потребление памяти составляет kB: 314028 RSS: 74704 Dirty: 59672
так, общее реальное потребление ~ 74Mb. Также я вижу некоторые большие блоки с [anon] отображением в моем pmap Для чего PHP использует эти блоки?
версия php: 5.5.9-1ubuntu4.14 Расширения php:
[email protected]:~# 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