近日在升级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,支持问题即可解决。

 

原创文章,转载请注明

黄聪:wordpress中PHP运行错最有效解决办法Fatal error: Out of memory (allocated 6029312)(转)的更多相关文章

  1. PHP运行错最有效解决办法Fatal error: Out of memory (allocated 786432) (tried to allocate 98304 bytes) in H:\freehost\zhengbao2\web\includes\lib_common.php on line 744

    原文 PHP运行错最有效解决办法Fatal error: Out of memory (allocated 6029312) Fatal error: Out of memory (allocated ...

  2. Eclipse中引入com.sun.image.codec.jpeg包报错的完美解决办法

    转: Eclipse中引入com.sun.image.codec.jpeg包报错的完美解决办法  更新时间:2018年02月14日 17:13:03   投稿:wdc   我要评论   Java开发中 ...

  3. Android权限管理之Android 6.0运行时权限及解决办法

    前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以 ...

  4. 腾讯开放平台 手机QQ登录 错误码:110406 解决办法

    作者:Panda Fang 出处:http://www.cnblogs.com/lonkiss/p/4204284.html 原创文章,转载请注明作者和出处,未经允许不可用于商业营利活动 腾讯开发平台 ...

  5. 工作总结 EntityFramework中出现DateTime2异常的完美解决办法

    EntityFramework中出现DateTime2异常的完美解决办法   今天在使用entityframework往数据库插入数据的时候,突然出现了一个数据类型转换异常的问题: System.Da ...

  6. pom.xml内容没有错,但一直报错红叉 解决办法

    转自:http://www.cnblogs.com/sxdcgaq8080/p/5590254.html [maven] pom.xml内容没有错,但一直报错红叉 解决办法 1.首先看一下下面的这两个 ...

  7. MAC安装MacPorts 卡在“正在运行软件包脚本”的解决办法

    MAC安装MacPorts 卡在"正在运行软件包脚本"的解决办法 点击右上角强制结束掉"安装器" 打开terminal, 输入命令"ps -ef | ...

  8. IIS关于“ 配置错误 不能在此路径中使用此配置节”的解决办法

    IIS关于“ 配置错误 不能在此路径中使用此配置节”的解决办法 原文链接:http://www.cnblogs.com/200325074/p/3679316.html 今天刚安装好IIS8.5, 我 ...

  9. Excel在任务栏中只显示一个窗口的解决办法

     Excel在任务栏中只显示一个窗口的解决办法  以前朋友遇到过这个问题,这次自己又遇到了,习惯了以前的那种在任务栏中显示全部窗口,方便用Alt+Tab键进行切换. 如果同时打开许多Excel工作簿, ...

随机推荐

  1. tyvj 1055 区间dp

    P1055 沙子合并 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述     设有N堆沙子排成一排,其编号为1,2,3,…,N(N<=300).每堆沙子 ...

  2. tyvj1012 P1012 - 火柴棒等式 ——暴力枚举

    题目链接:https://www.tyvj.cn/Problem_Show.aspx?id=1012 可以发现:最大的数字绝对不超过999,只要枚举出0-999所有数字需要的火柴数,然后再枚举C和A, ...

  3. c#部分---网吧充值系统;简易的闹钟;出租车计费;简单计算器;对战游戏;等额本金法计算贷款还款利息等;随机生成10个不重复的50以内的整数;推箱子;

    网吧充值系统namespace ConsoleApplication1 { class Program { struct huiyuan { public string name; public st ...

  4. android中的Handler

    android的Handler   前言 学习android一段时间了,为了进一步了解android的应用是如何设计开发的,决定详细研究几个开源的android应用.从一些开源应用中吸收点东西,一边进 ...

  5. linux之df命令

    介绍: Linux中df命令可以用来显示目前在Linux系统上的文件系统的磁盘使用情况统计.这些工具可以方便地知道哪些文件系统消耗多少内存.此外,如果被拾起,并且提供一个特定的文件名作为df命令的参数 ...

  6. AS3 Embed用法笔记

    1. 用[Embed]元数据标签可以嵌入GIF,PNG,JPEG,或者MP3文件.ActionScript代码的顺序非常重要.你必须在声明变量前添加[Embed]元数据标签,而且这个变量的类型会是Cl ...

  7. CSS Position 定位属性介绍

    1.介绍 1.1 说明 Position 属性:规定元素的定位类型.即元素脱离文档流的布局,在页面的任意位置显示. 1.2 主要的值 ①absolute :绝对定位:脱离文档流的布局,遗留下来的空间由 ...

  8. WCF入门教程三[WCF的宿主]

    一.WCF服务应用程序与WCF服务库 我们在平时开发的过程中常用的项目类型有“WCF 服务应用程序”和“WCF服务库”. WCF服务应用程序,是一个可以执行的程序,它有独立的进程,WCF服务类契约的定 ...

  9. shell之脚本片断

    16. 以下是平台信息 CentOS Linux release 7.1.1503 (Core) Linux mysql-dev1 3.10.0-229.el7.x86_64 #1 SMP Fri M ...

  10. python数据类型之dict

    1.clear:删除所有元素 #D.clear() -> None. Remove all items from D dic_a ={:::'gen'} dic_a.clear() print( ...