PHP記憶體洩漏檢測方法
阿新 • • 發佈:2019-02-19
一 PHP內建記憶體洩漏探測:
PHP本身有自己的記憶體管理,在編譯時,增加編譯選項--enable-debug 以及相應擴充套件編譯時加上 ./configure --enable-debug,這樣編譯後,使用命令列執行php test.php 如果有記憶體洩漏則會往 標準錯誤輸出 列印錯誤資訊。
注意:這個方法只能檢測到使用了Zend記憶體管理的情況,對於直接使用malloc/free來申請記憶體的應用或擴充套件是無法檢測到的。
二 valgrind
相關地址:
https://bugs.php.net/bugs-getting-valgrind-log.php
http://valgrind.org/
PHP本身有自己的記憶體管理,在編譯時,增加編譯選項--enable-debug 以及相應擴充套件編譯時加上 ./configure --enable-debug,這樣編譯後,使用命令列執行php test.php 如果有記憶體洩漏則會往 標準錯誤輸出 列印錯誤資訊。
注意:這個方法只能檢測到使用了Zend記憶體管理的情況,對於直接使用malloc/free來申請記憶體的應用或擴充套件是無法檢測到的。
二 valgrind
USE_ZEND_ALLOC是PHP提供的hook,我們可以在啟動PHP前指定USE_ZEND_ALLOC=0,關閉記憶體管理功能。這樣所有的記憶體分配都會直接向作業系統申請,這樣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*
相關地址:
https://bugs.php.net/bugs-getting-valgrind-log.php
http://valgrind.org/