黃聰:wordpress中PHP運行錯最有效解決辦法Fatal error: Out of memory (allocated 6029312)(轉)

近日在升級wordpress 3.2.1和若干插件的過程當中,發現了一個wordpress的錯誤:Allowed memory size of XXX bytes exhaustedphp

Fatal error: Allowed memory size of 25165824 bytes exhausted (tried to allocate 150 bytes) in [Blog root path]/wp-includes/pomo/mo.php on line 206html

 

 

經過搜索網絡和請教牛人,發現可以得出來的錯誤類型緣由和解決方案基本上只有幾種:mysql

有幾種相似的報錯信息:nginx

  • Fatal error: Out of memory (allocated 28835840) (tried to allocate 3981531 bytes) in [Blog root path]/wp-includes/class-http.php on line 1426
  • (similar message) in [Blog root path]/wp-admin/admin.php on line 40
  • (similar message) in [Blog root path]/wp-admin/includes/media.php on line 268
  • Fatal error: Out of memory (allocated 49545216) (tried to allocate 77824 bytes) in /home/xxxxx/public_html/xyz/admin.php(1758) on line 40
  • Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 147555 bytes) in [Blog root path]/wp-includes/wp-db.php on line 97

從表面上看這類報錯均是因爲內存不夠用致使的,可是到底是什麼致使了本來運行的很好的程序忽然變成這個樣子呢?(或者你是在新安裝一個wordpress)sql

我查看了一下官方網站的Requirements大致以下:apache

3.2版本的WP須要PHP5.2.4或更高,MySQL5.0或更高,須要運行Apache或者Nginx作Web請求服務。vim

 

To run WordPress your host just needs a couple of things:

  • PHP version 5.2.4 or greater
  • MySQL version 5.0 or greater

The requirements have changed as of WordPress 3.2. The minimum requirements for WordPress 3.1 are PHP 4.3 and MySQL 4.1.2.服務器

That’s really it. We recommend Apache or Nginx as the most robust and featureful server for running WordPress, but any server that supports PHP and MySQL will do. That said, we can’t test every possible environment and each of the hosts on our hosting page supports the above and more with no problems.網絡

 

 

估算了一下,要運行這幾個服務的話,最低須要70M 以上的內存,通常的主機或者空間提供商都是預先跑起來這些服務之後額外給你的php程序再提供最少16M 的內存的(要是更大的話幾個G 的也有,固然不是免費的:P),經測試,wordpress在locahost上跑起來的時候佔用了大約11.5M左右的內存空間,也就是說,精簡安裝的狀況下,wordpress在不多的內存下也能夠運行起來,而本人的主機提供商提供了32M  的內存空間,而且在升級wordpress以前一直運行穩定,未出現過memory問題,而且要特別提到的一點是,個人wordpress上安裝了21個插件,也佔用很多內存。ide

接下來先來看看網絡上的解決方法吧:

方法一:You can even consider adding a line in .htaccess file which will resolve the issue.  

php_value memory_limit 256M

就是在 .htaccess 文件中加上紅色的那行字

 

 

方法二:Add this to your wp-config.php file:

define ('WP_MEMORY_LIMIT', '256M' );

在你的 wp-config.php 文件中加上紅色的那行字

 

 

方法三:wp-settings.php,編輯這個文件,修改define('WP_MEMORY_LIMIT', '32M');

define('WP_MEMORY_LIMIT', '256M');

 

 

方法四:在你的博客目錄中添加一個 php.ini 文件,而且寫入下面那行

memory_limit=256M

 

 

方法五:實際上是方法四升級版:在你的博客目錄中添加一個 php.ini 文件,而且寫入下面的內容

register_globals=Off
safe_mode=off
magic_quotes_gpc=On
allow_url_include=Off
file_uploads=on
memory_limit=256M
max_executi alt=90
post_max_size=10M
upload_max_filesize=10M
max_input_time=300
 

以上列舉了不少方法,到底有沒有用呢? 逐一分析並嘗試:

方法一:

htaccess文件是Apache服務器中的一個配置文件,它負責相關目錄下的網頁配置。

經過htaccess文件,能夠幫咱們實現:網頁301重定向、自定義404錯誤頁面、改變文件擴展名、容許/阻止特定的用戶或者目錄的訪問、禁止目錄列表、配置默認文檔等功能。

咱們在此將php的memory的限制手動改成 256M大小,其實就是提升咱們的php程序分配的運行時內存空間,可是有沒有效果呢?

在必定狀況下可能會有效果,由於這樣寫跟寫在配置文件中的效果實際上是同樣的,可是有的主機供應商可能會刻意屏蔽掉htaccess的功能。

方法2、方法三:

都是在wordpress的配置文件中提升咱們的php程序分配的運行時內存空間,可是有可能會有個疑問,假如個人主機供應商只給我32M的空間我在這裏設置有用麼?其實這裏設置的大小跟主機供應商給你提供的大小沒有太多的對應關係。舉個例子,就像在只有1G 物理內存的狀況下,你仍然能夠運行佔用2G 內存的程序同樣,這裏設置的差很少是邏輯上可使用的內存大小的意思,可是,有個問題要注意,若是物理內存比較小而須要的比較多的話,系統可能會由於頻繁的頁置換致使系統的顛簸,也有可能主機資源管理控制軟件回把你的這堆進程kill掉。(後面這段不懂無所謂,也是因不一樣的主機而定)

 

另外:在PHP5.2.3-win32這個版本有個bug,PHP對於內存的分配有泄漏的狀況

當你分配一個較大的內存空間時,他沒法正確編址    連接地址

 

PHP Fatal error: Out of memory (allocated 1048576) (tried to allocate 393216 bytes)
PHP Fatal error: Out of memory (allocated 1048576) (tried to allocate 393216 bytes)
PHP Fatal error: Out of memory (allocated 1048576) (tried to allocate 393216 bytes)
PHP Fatal error: Out of memory (allocated 1048576) (tried to allocate 393216 bytes)
PHP Fatal error: Out of memory (allocated 786432) (tried to allocate 393216 bytes)
PHP Fatal error: Out of memory (allocated 1310720) (tried to allocate 393216 bytes)

 

方法4、方法五:

這個php.ini 是php環境中最正統的設置文件,他這裏的設置也是提升咱們的php程序分配的運行時內存空間。

可是:通常的php空間的話,管理員是不會開放整個php 運行環境的配置權限給你的,另外管理員還有可能強制指定整臺主機的配置文件只使用/etc/php/apache2-php5.3/php.ini (這個路徑可能不太同樣,本人本地計算機是一臺Gentoo+php5.3+apache2+mysql的機器)。因此也不必定起做用。

另外這樣設置完成後,還須要將環境變量重置一下,

SetEnv PHPRC [Blog root path]/php.ini

 

可是要執行這條指令,通常的空間也是沒有辦法的,除非你是VPS。:)

============================================================================

        分割一下:若是上面的方法已經解決問題了能夠不用向後看了,後面是深層次緣由

============================================================================

咱們從程序這邊找找問題,是否是能夠獲得改善。就從這行代碼開始看吧。wp-includes/pomo/mo.php on line 206

                 截圖連接

 

通過查看,我得出了一個結論,這個出錯的文件屬於多國語言翻譯的功能中的一塊,主要負責的是英文轉換成其餘語言而後在後臺管理界面中顯示翻譯後的內容。好比常見的wordpress中文版。

function Translation_Entry($args=array()) {
// if no singular — empty object
if (!isset($args[‘singular’])) {
return;
}
// get member variable values from args hash
foreach ($args as $varname => $value) {
$this->$varname = $value;
}
if (isset($args[‘plural’])) $this->is_plural = true;
if (!is_array($this->translations)) $this->translations = array();
if (!is_array($this->references)) $this->references = array();
if (!is_array($this->flags)) $this->flags = array();
}

 

能夠看到我在圖上標註出來的這一小段代碼這段代碼的意思是在翻譯後的文件中取出翻譯好的字符串,在顯示時替換掉原來的英文,foreach是枚舉每個字符串變量。
接着看翻譯後的文件是什麼樣子的:
截圖連接

這個文件到底有多大呢?

能夠看出,這個文件有599行,383747byte。共3313條記錄,在本機上,單單使用vim打開該文件時,MEM%佔用達到0.4%,本人使用的電腦爲4G 內存,也就是說只是打開該文件時就須要佔用掉16M左右的內存,此時尚未對這個文件中的字符串解析和替換,相信在進行這一系列操做時,佔用會更多。

能夠得出來一個結論:WordPress是個吃內存大戶,尤爲是中文版的wordpress,那如何解決呢?

解決:

當你升級後發現進不去後臺了,那就嘗試登陸ftp,將wp-content/languages/ 下的文件刪光,嘗試下是否是能夠了?

固然,若是仍是進不去的話,最好是將wp-content/plugins,目錄改個名字,即禁用掉了全部的插件,這樣的話,應該內存佔用會變得很是少。

 

 

若是仍是不能夠的話,請留言吧,能夠一塊兒討論一下:)

 

PS:

1.發現了wordpress中文翻譯中,並非按需進行字符串替換的,如能將此函數改成按需替換顯示的話,相信可以大幅減小用於翻譯的內存和CPU佔用。

2.解決wordpress 內存佔用問題的關鍵是如何讓你的wordpress合理使用內存,而不是越大越好,固然,若是可以聯繫空間提供商擴大內存解決問題的話也是很是好的一種方法:)若是想省錢解決問題的話,就是採用英文版的wordpress不也是很好的嗎:)

3.正在看wordpress的一部分可能設計到權限提高的代碼,閱讀得不是很是明白,可是感受有邏輯漏洞存在,可能會是一個後臺提權BUG。

4.寫的比較倉促,錯別字和表達不妥的地方還請你們指出。

coolfire同窗提出了一種相似的方法,跟方法三方法四殊途同歸:

在網站根目錄(public_html)下建立一個文件php.ini,裏面添加下面的代碼:

memory_limit = 64M

而後編輯同目錄下的.htaccess文件,在文件末尾添加如下代碼:

suPHP_ConfigPath /home/username/public_html/

用你控制面板的用戶名替換username,支持問題便可解決。 

 

原創文章,轉載請註明

相關文章
相關標籤/搜索