wordpress中PHP运行错最有效解决办法Fatal error: Out of memory (allocated 6029312)(转)
近日在升級(jí)wordpress 3.2.1和若干插件的過程中,發(fā)現(xiàn)了一個(gè)wordpress的錯(cuò)誤: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
?
通過搜索網(wǎng)絡(luò)和請(qǐng)教牛人,發(fā)現(xiàn)能夠得出來的錯(cuò)誤類型原因和解決方案基本上只有幾種:
有幾種類似的報(bào)錯(cuò)信息:
- 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
從表面上看這類報(bào)錯(cuò)均是由于內(nèi)存不夠用導(dǎo)致的,但是究竟是什么導(dǎo)致了原本運(yùn)行的很好的程序突然變成這個(gè)樣子呢?(或者你是在新安裝一個(gè)wordpress)
我查看了一下官方網(wǎng)站的Requirements大體如下:
3.2版本的WP需要PHP5.2.4或更高,MySQL5.0或更高,需要運(yùn)行Apache或者Nginx做Web請(qǐng)求服務(wù)。
?
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.
?
估算了一下,要運(yùn)行這幾個(gè)服務(wù)的話,最低需要70M 以上的內(nèi)存,一般的主機(jī)或者空間提供商都是預(yù)先跑起來這些服務(wù)以后額外給你的php程序再提供最少16M 的內(nèi)存的(要是更大的話幾個(gè)G 的也有,當(dāng)然不是免費(fèi)的:P),經(jīng)測(cè)試,wordpress在locahost上跑起來的時(shí)候占用了大約11.5M左右的內(nèi)存空間,也就是說,精簡(jiǎn)安裝的情況下,wordpress在很少的內(nèi)存下也可以運(yùn)行起來,而本人的主機(jī)提供商提供了32M ?的內(nèi)存空間,并且在升級(jí)wordpress之前一直運(yùn)行穩(wěn)定,未出現(xiàn)過memory問題,并且要特別提到的一點(diǎn)是,我的wordpress上安裝了21個(gè)插件,也占用不少內(nèi)存。
接下來先來看看網(wǎng)絡(luò)上的解決方法吧:
方法一: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,編輯這個(gè)文件,修改define('WP_MEMORY_LIMIT', '32M');為
define('WP_MEMORY_LIMIT', '256M');
?
方法四:在你的博客目錄中添加一個(gè) php.ini 文件,并且寫入下面那行
memory_limit=256M
?
方法五:其實(shí)是方法四升級(jí)版:在你的博客目錄中添加一個(gè) php.ini 文件,并且寫入下面的內(nèi)容
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服務(wù)器中的一個(gè)配置文件,它負(fù)責(zé)相關(guān)目錄下的網(wǎng)頁(yè)配置。
通過htaccess文件,可以幫我們實(shí)現(xiàn):網(wǎng)頁(yè)301重定向、自定義404錯(cuò)誤頁(yè)面、改變文件擴(kuò)展名、允許/阻止特定的用戶或者目錄的訪問、禁止目錄列表、配置默認(rèn)文檔等功能。
我們?cè)诖藢hp的memory的限制手動(dòng)改為 256M大小,其實(shí)就是提高我們的php程序分配的運(yùn)行時(shí)內(nèi)存空間,但是有沒有效果呢?
在一定情況下可能會(huì)有效果,因?yàn)檫@樣寫跟寫在配置文件中的效果其實(shí)是一樣的,但是有的主機(jī)供應(yīng)商可能會(huì)刻意屏蔽掉htaccess的功能。
方法二、方法三:
都是在wordpress的配置文件中提高我們的php程序分配的運(yùn)行時(shí)內(nèi)存空間,但是有可能會(huì)有個(gè)疑問,假如我的主機(jī)供應(yīng)商只給我32M的空間我在這里設(shè)置有用么?其實(shí)這里設(shè)置的大小跟主機(jī)供應(yīng)商給你提供的大小沒有太多的對(duì)應(yīng)關(guān)系。舉個(gè)例子,就像在只有1G 物理內(nèi)存的情況下,你仍然可以運(yùn)行占用2G 內(nèi)存的程序一樣,這里設(shè)置的差不多是邏輯上可以使用的內(nèi)存大小的意思,但是,有個(gè)問題要注意,如果物理內(nèi)存比較小而需要的比較多的話,系統(tǒng)可能會(huì)因?yàn)轭l繁的頁(yè)置換導(dǎo)致系統(tǒng)的顛簸,也有可能主機(jī)資源管理控制軟件回把你的這堆進(jìn)程kill掉。(后面這段不懂無所謂,也是因不同的主機(jī)而定)
?
另外:在PHP5.2.3-win32這個(gè)版本有個(gè)bug,PHP對(duì)于內(nèi)存的分配有泄漏的情況
當(dāng)你分配一個(gè)較大的內(nèi)存空間時(shí),他無法正確編址 ? ?鏈接地址
?
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)
方法四、方法五:
這個(gè)php.ini 是php環(huán)境中最正統(tǒng)的設(shè)置文件,他這里的設(shè)置也是提高我們的php程序分配的運(yùn)行時(shí)內(nèi)存空間。
但是:一般的php空間的話,管理員是不會(huì)開放整個(gè)php 運(yùn)行環(huán)境的配置權(quán)限給你的,另外管理員還有可能強(qiáng)制指定整臺(tái)主機(jī)的配置文件只使用/etc/php/apache2-php5.3/php.ini (這個(gè)路徑可能不太一樣,本人本地計(jì)算機(jī)是一臺(tái)Gentoo+php5.3+apache2+mysql的機(jī)器)。所以也不一定起作用。
另外這樣設(shè)置完成后,還需要將環(huán)境變量重置一下,
SetEnv PHPRC [Blog root path]/php.ini
但是要執(zhí)行這條指令,一般的空間也是沒有辦法的,除非你是VPS。:)
============================================================================
? ? ? ? 分割一下:如果上面的方法已經(jīng)解決問題了可以不用向后看了,后面是深層次原因
============================================================================
我們從程序這邊找找問題,是不是可以得到改善。就從這行代碼開始看吧。wp-includes/pomo/mo.php on line 206
? ? ? ? ? ? ??? ?截圖鏈接
?
經(jīng)過查看,我得出了一個(gè)結(jié)論,這個(gè)出錯(cuò)的文件屬于多國(guó)語言翻譯的功能中的一塊,主要負(fù)責(zé)的是英文轉(zhuǎn)換成其他語言然后在后臺(tái)管理界面中顯示翻譯后的內(nèi)容。比如常見的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();
}
可以看到我在圖上標(biāo)注出來的這一小段代碼這段代碼的意思是在翻譯后的文件中取出翻譯好的字符串,在顯示時(shí)替換掉原來的英文,foreach是枚舉每一個(gè)字符串變量。
接著看翻譯后的文件是什么樣子的:
截圖鏈接
這個(gè)文件到底有多大呢?
可以看出,這個(gè)文件有599行,383747byte。共3313條記錄,在本機(jī)上,單單使用vim打開該文件時(shí),MEM%占用達(dá)到0.4%,本人使用的電腦為4G 內(nèi)存,也就是說只是打開該文件時(shí)就需要占用掉16M左右的內(nèi)存,此時(shí)還沒有對(duì)這個(gè)文件中的字符串解析和替換,相信在進(jìn)行這一系列操作時(shí),占用會(huì)更多。
可以得出來一個(gè)結(jié)論:WordPress是個(gè)吃內(nèi)存大戶,尤其是中文版的wordpress,那如何解決呢?
解決:
當(dāng)你升級(jí)后發(fā)現(xiàn)進(jìn)不去后臺(tái)了,那就嘗試登錄ftp,將wp-content/languages/ 下的文件刪光,嘗試下是不是可以了?
當(dāng)然,如果還是進(jìn)不去的話,最好是將wp-content/plugins,目錄改個(gè)名字,即禁用掉了所有的插件,這樣的話,應(yīng)該內(nèi)存占用會(huì)變得非常少。
?
如果還是不可以的話,請(qǐng)留言吧,可以一起討論一下:)
?
PS:
1.發(fā)現(xiàn)了wordpress中文翻譯中,并不是按需進(jìn)行字符串替換的,如能將此函數(shù)改為按需替換顯示的話,相信能夠大幅減少用于翻譯的內(nèi)存和CPU占用。
2.解決wordpress 內(nèi)存占用問題的關(guān)鍵是如何讓你的wordpress合理使用內(nèi)存,而不是越大越好,當(dāng)然,如果能夠聯(lián)系空間提供商擴(kuò)大內(nèi)存解決問題的話也是非常好的一種方法:)如果想省錢解決問題的話,就是采用英文版的wordpress不也是很好的嗎:)
3.正在看wordpress的一部分可能設(shè)計(jì)到權(quán)限提升的代碼,閱讀得不是非常明白,但是感覺有邏輯漏洞存在,可能會(huì)是一個(gè)后臺(tái)提權(quán)BUG。
4.寫的比較倉(cāng)促,錯(cuò)別字和表達(dá)不妥的地方還請(qǐng)大家指出。
coolfire同學(xué)提出了一種類似的方法,跟方法三方法四異曲同工:
在網(wǎng)站根目錄(public_html)下創(chuàng)建一個(gè)文件php.ini,里面添加下面的代碼:
memory_limit = 64M然后編輯同目錄下的.htaccess文件,在文件末尾添加以下代碼:
suPHP_ConfigPath /home/username/public_html/用你控制面板的用戶名替換username,支持問題即可解決。?
本文轉(zhuǎn)自黃聰博客園博客,原文鏈接:http://www.cnblogs.com/huangcong/p/4465224.html,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的wordpress中PHP运行错最有效解决办法Fatal error: Out of memory (allocated 6029312)(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 虚拟机安装(Cent OS)
- 下一篇: php拆分数字字符串方法