最近由於工做的須要,安裝了下ecshop,這個曾經的火爆開源程序,如今也呈現出疲態。php
一、請看官方的運行環境推薦:nginx
服務器端運行環境推薦
·php版本5.0以上5.3如下的版本(推薦使用5.2系列版本)
·Mysql版本5.0及以上
·空間安裝zend
·空間支持文件鎖功能
·開啓GD功能
·Mysql函數支持mbstring、iconv、fsockopen
看見了吧,PHP5.3如下的版本,還推薦使用5.2的,尼妹的,如今哪一個虛擬機還敢用5.3如下的版本?還在用5.3如下的版本?看看tiandi用的2兩個主機,衡天的和wopus的都是5.3.28,至於爲何不用5.3如下的版本,本身google」php內存泄露」。web
Ecshop上個月剛更新了最新版本,寫代碼的思路依舊堅挺,仍舊使用5.2版本,好吧,爲了作一些測試,須要在本機上進行調試,但本機上裝了wp3.9,忘了從哪一個版本開始wp只支持5.3以上的php,因此本機的PHP環境是5.4.13。起先,作了兩個批處理來切換php5.2.1和php5.4.13,而後發覺一直用批處理切換也累啊,索性直接5.4.13上跑ecshop看看哪裏有問題就改哪裏吧,結果泥煤的首頁直接來個錯誤。算法
Strict Standards: Only variables should be passed by reference in D:\tiandiyoyo\hengtian\ecshop\upload\includes\cls_template.php on line 424sql
不淡定了,打開cls_template.php,定位到424行,發現下面內容:數組
代碼以下 | 複製代碼 |
$tag_sel = array_shift(explode(' ', $tag));性能優化 |
將其註釋掉,分別拆開,添加兩行服務器
代碼以下 | 複製代碼 |
$tag_tmp = (explode(' ', $tag)); |
緣由在於PHP5.3版本開始,array_shift不支持函數返回,記得以前博客裏好像還有個帖子專門說了php5.3版本的改變,剛搜索沒找到函數
以上是複製其餘大神的做品,這裏呢再添加一點我本身的東西,我使用的是PHP5.5進行安裝,首先遇到的問題就是版本的問題致使的函數不兼容,我是菜鳥,在作好了這幾個以後忽然發現,PHP5.3如下有一個叫作內存泄漏的問題,就是在PHP5.3版本以前,內存管理用的是引用計數。當兩個或者多個變量互相應用成環狀時,便會出現內存泄露。5.3之後改進了內存管理的算法,會好不少。
所謂內存泄漏是指進稱在執行過程當中,內存的佔有率逐步升高,不釋放, 系統所擁有的可用內存愈來愈少的現象。
php-fpm耗光內存,不釋放,就是所謂的內存泄漏,內存泄漏對長期運行的程序有威脅,因此應該按期重啓進程,例如php-fpm裏面有個配置,max-request,就是控制fast-cgi進程處理多少個請求後重啓,這樣系統可用釋放內存,可是若是內存佔用率增加速度很是快,頻繁重啓進程,就會影響服務的穩定性,因此這個問題必須正面解決。
後來,我才發現其實不須要去修改php的源代碼,php.ini配置文件裏面有兩個配置項: auto_append_file,auto_prepend_file,能夠在請求先後注入代碼 ....
真是悲劇
web程序作性能優化也是這個思路,可是要簡單不少,無需寫代碼,在nginx log裏面加上$request_time ,用awk/sort 處理一下就能夠找出瓶頸。
可能有不少的讀者碰到過相似下面的錯誤吧:
Fatal error: Allowed memory size of X bytes exhausted (tried to allocate Y bytes)
這個錯誤的信息很明確,PHP已經達到了容許使用的最大內存了,一般上來講這頗有多是咱們的程序編寫的有些問題。好比:一次性讀取超大的文件到內存中,或者出現超大的數組,或者在大循環中的沒有及時是放掉再也不使用的變量,這些都有可能會形成內存佔用過大而被終止。
PHP默認的最大內存使用大小是32M, 若是你真的須要使用超過32M的內存能夠修改php.ini配置文件的以下配置:
memory_limit = 32M
若是你沒法修改php配置文件,若是你的PHP環境沒有禁用ini_set()函數,也能夠動態的修改最大的內存佔用大小:
<?php ini_set("memory_limit", "128M");
既然咱們能動態的調整最大的內存佔用,那咱們是否有辦法獲取目前的內存佔用狀況呢?答案是確定的。