1. 程式人生 > >PHP記憶體洩漏檢測方法

PHP記憶體洩漏檢測方法

一 PHP內建記憶體洩漏探測:

PHP本身有自己的記憶體管理,在編譯時,增加編譯選項--enable-debug 以及相應擴充套件編譯時加上 ./configure --enable-debug,這樣編譯後,使用命令列執行php test.php 如果有記憶體洩漏則會往 標準錯誤輸出 列印錯誤資訊。

注意:這個方法只能檢測到使用了Zend記憶體管理的情況,對於直接使用malloc/free來申請記憶體的應用或擴充套件是無法檢測到的。


二 valgrind

wget http://valgrind.org/downloads/valgrind-3.11.0.tar.bz2
tar -jxvf valgrind-3.11.0.tar.bz2
cd valgrind-3.11.0; ./autogen.sh
mkdir /usr/local/valgrind/ && ./configure --prefix=/usr/local/valgrind
make && make install
vim /etc/profile
export USE_ZEND_ALLOC=0

//php-cli
valgrind --leak-check=full php test.php

//php-fpm
vim 
# php_fpm_BIN=${exec_prefix}/sbin/php-fpm
export USE_ZEND_ALLOC=0
php_fpm_BIN="valgrind --log-file=/var/valgrind-%p.log /usr/local/php/sbin/php-fpm"

/usr/local/php/sbin/init.d.php-fpm restart
tail -f valgrind*
USE_ZEND_ALLOC是PHP提供的hook,我們可以在啟動PHP前指定USE_ZEND_ALLOC=0,關閉記憶體管理功能。這樣所有的記憶體分配都會直接向作業系統申請,這樣valgrind就可以幫助我們定位問題。

相關地址:
https://bugs.php.net/bugs-getting-valgrind-log.php
http://valgrind.org/