###內存泄漏
  內存泄漏指的是在程序運行過程中申請了內存,但是在使用完成后沒有及時釋放的現象, 對于普通運行時間較短的程序來說可能問題不會那么明顯,但是對于長時間運行的程序, 比如Web服務器,后臺進程等就比較明顯了,隨著系統運行占用的內存會持續上升, 可能會因為占用內存過高而崩潰,或被系統殺掉
###PHP的內存泄漏
  [PHP](http://lib.csdn.net/base/php)屬于高級語言,語言級別并沒有內存的概念,在使用過程中完全不需要主動申請或釋放內存, 所以在PHP用戶代碼級別也就不存在內存泄漏的概念了。
但畢竟PHP是使用C編寫的解釋器,而[C語言](http://lib.csdn.net/base/c)的程序是可能出現內存泄漏問題,所以本質上還是一樣的,那么可以這么說:如果你的PHP程序內存泄漏了,會有三種可能:
首先肯能是自己的代碼有問題,比如沒有及時釋放大內存的變量等。
很多公司都會有自己的PHP擴展,而擴展通常也使用C/C++來編寫,這樣擴展本身也可能會因為內存不正確釋放而導致內存泄漏。
有些擴展是對第三方庫的一種包裹, 比如PHP的sqlite數據庫操作接口主要是在libsqlite之上進行了封裝,所以如果 libsqlite本身有內存泄漏的話,那也可能會帶來問題。
###PHP-CGI
  根據官方的介紹,php-cgi不存在內存泄漏,每個請求完成后php-cgi會回收內存,但是不會釋放給[操作系統](http://lib.csdn.net/base/operatingsystem),這樣就會導致大量內存被php-cgi占用。(這個對于內存不大的服務器,比如云主機就太致命了,利用命令:ps aux|grep php-cgi|grep -v grep|awk '{if($4>=1)print $2}'
?可以查詢占比1%的php-cgi的pid,然后kill掉(kill -9),這個方法比較好)?官方的解決辦法是降低PHP_FCGI_MAX_REQUESTS
的值。
###Nginx&PHP-FPM
  這里先簡單說一下nginx+php-fpm模式的工作原理:
nginx服務器fork出n個子進程(worker),php-fpm管理器fork出n個子進程。
當有用戶請求,nginx的一個worker接收請求,并將請求拋到socket中。
php-fpm空閑的子進程監聽到socket中有請求,接收并處理請求。
  這里要重點說一下第三步驟。第三步涉及到php-fpm進程生命周期的東西。一個php-fpm的生命周期大致是這樣的:模塊初始化(MINIT)-> 模塊激活(RINIT)-> 請求處理 -> 模塊停用(RSHUTDOWN) -> 模塊激活(RINIT)-> 請求處理 -> 模塊停用(RSHUTDOWN)……. 模塊激活(RINIT)-> 請求處理 -> 模塊停用(RSHUTDOWN)-> 模塊關閉(MSHUTDOWN)。在一個php-fpm進程的生命周期里,會有多次的模塊激活(RINIT)-> 請求處理 -> 模塊停用(RSHUTDOWN)的過程。這個“請求處理”的大致過程是這樣的:php讀取相應的php文件,對其進行詞法分析,生成opcode,zend虛擬機執行opcode。
  PHP配置文件里面的memory_limit 這個東西,其實,它限制的只是這個“請求處理”的內存。所以,這個參數跟php-fpm進程占用的內存并沒有什么關系。php是用c寫的,所以,難免又會一些內存泄露。也就是說,在“請求處理”這個過程結束后,有些變量沒有被銷毀,然后就導致一個php-fpm進程占用的內存越來越大。
那么,有什么辦法能阻止這個問題呢??php-fpm.conf中有個參數pm.max_requests
,等同于PHP_FCGI_MAX_REQUESTS。該值的意思是一個fpm進程處理多少個請求后自動殺掉另起新進程。?這個參數默認是關閉的,我們需要開啟這個參數,并且適當降低這個值,用以讓php-fpm自動的釋放內存。另一個跟它有關聯的值max_children,這個是每次php-fpm會建立多少個進程,這樣實際上的內存消耗是max_children*max_requests*每個請求使用內存,根據這個我們可以預估一下內存的使用情況,就不用再寫腳本去kill了。
- 技能知識點
- 對死鎖問題的理解
- 文件系統原理:如何用1分鐘遍歷一個100TB的文件?
- 數據庫原理:為什么PrepareStatement性能更好更安全?
- Java Web程序的運行時環境到底是怎樣的?
- 你真的知道自己要解決的問題是什么嗎?
- 如何解決問題
- 經驗分享
- GIT的HTTP方式免密pull、push
- 使用xhprof對php7程序進行性能分析
- 微信掃碼登錄和使用公眾號方式進行掃碼登錄
- 關于curl跳轉抓取
- Linux 下配置 Git 操作免登錄 ssh 公鑰
- Linux Memcached 安裝
- php7安裝3.4版本的phalcon擴展
- centos7下php7.0.x安裝phalcon框架
- 將字符串按照指定長度分割
- 搜索html源碼中標簽包的純文本
- 更換composer鏡像源為阿里云
- mac 隱藏文件顯示/隱藏
- 谷歌(google)世界各國網址大全
- 實戰文檔
- PHP7安裝intl擴展和linux安裝icu
- linux編譯安裝時常見錯誤解決辦法
- linux刪除文件后不釋放磁盤空間解決方法
- PHP開啟異步多線程執行腳本
- file_exists(): open_basedir restriction in effect. File完美解決方案
- PHP 7.1 安裝 ssh2 擴展,用于PHP進行ssh連接
- php命令行加載的php.ini
- linux文件實時同步
- linux下php的psr.so擴展源碼安裝
- php將字符串中的\n變成真正的換行符?
- PHP7 下安裝 memcache 和 memcached 擴展
- PHP 高級面試題 - 如果沒有 mb 系列函數,如何切割多字節字符串
- PHP設置腳本最大執行時間的三種方法
- 升級Php 7.4帶來的兩個大坑
- 不同域名的iframe下,fckeditor在chrome下的SecurityError,解決辦法~~
- Linux find+rm -rf 執行組合刪除
- 從零搭建Prometheus監控報警系統
- Bug之group_concat默認長度限制
- PHP生成的XML顯示無效的Char值27消息(PHP generated XML shows invalid Char value 27 message)
- XML 解析中,如何排除控制字符
- PHP各種時間獲取
- nginx配置移動自適應跳轉
- 已安裝nginx動態添加模塊
- auto_prepend_file與auto_append_file使用方法
- 利用nginx實現web頁面插入統計代碼
- Nginx中的rewrite指令(break,last,redirect,permanent)
- nginx 中 index try_files location 這三個配置項的作用
- linux安裝git服務器
- PHP 中運用 elasticsearch
- PHP解析Mysql Binlog
- 好用的PHP學習網(持續更新中)
- 一篇寫給準備升級PHP7的小伙伴的文章
- linux 安裝php7 -系統centos7
- Linux 下多php 版本共存安裝
- PHP編譯安裝時常見錯誤解決辦法,php編譯常見錯誤
- nginx upstream模塊--負載均衡
- 如何解決Tomcat服務器打開不了HOST Manager的問題
- PHP的內存泄露問題與垃圾回收
- Redis數據結構 - string字符串
- PHP開發api接口安全驗證
- 服務接口API限流 Rate Limit
- php內核分析---內存管理(一)
- PHP內存泄漏問題解析
- 【代碼片-1】 MongoDB與PHP -- 高級查詢
- 【代碼片-1】 php7 mongoDB 簡單封裝
- php與mysql系統中出現大量數據庫sleep的空連接問題分析
- 解決crond引發大量sendmail、postdrop進程問題
- PHP操作MongoDB GridFS 存儲文件,如圖片文件
- 淺談php安全
- linux上keepalived+nginx實現高可用web負載均衡
- 整理php防注入和XSS攻擊通用過濾