Ecshop安裝的坑,建議不要使用!


最近因為工作的需要,安裝了下ecshop,這個曾經的火爆開源程序,現在也呈現出疲態。

1、請看官方的運行環境推薦:

服務器端運行環境推薦
·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內存泄露”。

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 424

不淡定了,打開cls_template.php,定位到424行,發現下面內容:

 代碼如下 復制代碼

$tag_sel = array_shift(explode(' ', $tag));

將其注釋掉,分別拆開,添加兩行

 代碼如下 復制代碼

$tag_tmp = (explode(' ', $tag));
$tag_sel = array_shift($tag_tmp);
//$tag_sel = array_shift(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");

 

既然我們能動態的調整最大的內存占用,那我們是否有辦法獲取目前的內存占用情況呢?答案是肯定的。

 

  1. memory_get_usage(),這個函數的作用是獲取目前PHP腳本所用的內存大小。
  2. memory_get_peak_usage(),這個函數的作用返回當前腳本到目前位置所占用的內存峰值,這樣就可能獲取到目前的腳本的內存需求情況。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM