Fatal error: Out of memory (allocated 3670016)tried to allocate 12960 bytes)in E:\crmsaas\www\lib\applibbase.inc on line 5073如下圖:
通過搜索網(wǎng)絡(luò)和請(qǐng)教牛人,發(fā)現(xiàn)能夠得出來的錯(cuò)誤類型原因和解決方案基本上只有幾種:
有幾種類似的報(bào)錯(cuò)信息:
從表面上看這類報(bào)錯(cuò)均是由于內(nèi)存不夠用導(dǎo)致的,但是究竟是什么導(dǎo)致了原本運(yùn)行的很好的程序突然變成這個(gè)樣子呢?
我查看了一下官方網(wǎng)站的Requirements大體如下:
3.版本的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.
一般的主機(jī)或者空間提供商都是預(yù)先跑起來這些服務(wù)以后額外給你的php程序再提供最少16M 的內(nèi)存的(要是更大的話幾個(gè)G 的也有,當(dāng)然不是免費(fèi)的:P),
接下來先來看看網(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=Offsafe_mode=offmagic_quotes_gpc=Onallow_url_include=Offfile_uploads=onmemory_limit=256Mmax_executi alt=90post_max_size=10Mupload_max_filesize=10Mmax_input_time=300
以上列舉了很多方法,到底有沒有用呢? 逐一分析并嘗試:
方法一:
htaccess文件是Apache服務(wù)器中的一個(gè)配置文件,它負(fù)責(zé)相關(guān)目錄下的網(wǎng)頁配置。
通過htaccess文件,可以幫我們實(shí)現(xiàn):網(wǎng)頁301重定向、自定義404錯(cuò)誤頁面、改變文件擴(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的功能。
方法二、方法三:
都是在配置文件中提高我們的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繁的頁置換導(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)解決問題了可以不用向后看了,后面是深層次原因
我們從程序這邊找找問題,是不是可以得到改善。就從這行代碼開始看吧。
經(jīng)過查看,我得出了一個(gè)結(jié)論,這個(gè)出錯(cuò)的文件屬于多國(guó)語言翻譯的功能中的一塊,主要負(fù)責(zé)的是英文轉(zhuǎn)換成其他語言然后在后臺(tái)管理界面中顯示翻譯后的內(nèi)容。
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)留言吧,可以一起討論一下:)
1.發(fā)現(xiàn)了中文翻譯中,并不是按需進(jìn)行字符串替換的,如能將此函數(shù)改為按需替換顯示的話,相信能夠大幅減少用于翻譯的內(nèi)存和CPU占用。
2.解決內(nèi)存占用問題的關(guān)鍵是如何讓你的合理使用內(nèi)存,而不是越大越好,當(dāng)然,如果能夠聯(lián)系空間提供商擴(kuò)大內(nèi)存解決問題的話也是非常好的一種方法:)如果想省錢解決問題的話,就是采用英文版的不也是很好的嗎:)
3.正在看的一部分可能設(shè)計(jì)到權(quán)限提升的代碼,閱讀得不是非常明白,但是感覺有邏輯漏洞存在,可能會(huì)是一個(gè)后臺(tái)提權(quán)BUG。
4.寫的比較倉促,錯(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,支持問題即可解決。 以上就是Fatal error:Out of memory解決方法!