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


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

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 206

 

 

通過搜索網絡和請教牛人,發現能夠得出來的錯誤類型原因和解決方案基本上只有幾種:

有幾種類似的報錯信息:

  • 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)

我查看了一下官方網站的Requirements大體如下:

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

 

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個插件,也占用不少內存。

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

方法一: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的功能。

方法二、方法三:

都是在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)

 

方法四、方法五:

這個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,支持問題即可解決。 

 

原創文章,轉載請注明


免責聲明!

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



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