故障现象   

在运行PHP程序,通常会遇到“Fatal Error: Allowed memory size of xxxxxx bytes exhausted”的错误, 这个意味着PHP脚本使用了过多的内存,并超出了系统对其设置的允许最大内存。

解决这个问题,首先需要查看你的程序是否分配了过多的内存,在程序没有问题的情况下,你可以通过一下方法来增加PHP的内存限制(memory_limit)。

检查php的内存限制值

为了查看这个值,你需要建立一个空的php文件,比如view-php-info.php。然后将一下代码贴到里面。

<?php phpinfo(); ?>

将这个脚本放到你的Web服务器上,然后在浏览器中调用它。这时你可以看到你的PHP环境配置的信息,其中有一部分是关于“memory_limit”的, 如下图:

注:你可以用这种方法来查看php的其他参数设置,不仅仅是memory_limit

memory_limit应该设为多少?

这个完全依赖于你的应用的要求。比如Wordpress,运行起核心代码需要32MB。Drupal 6则要求这个值最小为16MB,并推荐设置为32MB。如果你又安装不少的插件(plugins),尤其是那些要进行图像处理的模块,那么你可能需要128MB或更高的内存。

如何设置memory_limit

 

方法1: php.ini

最简单或常用的方法是修改php.ini

1.首先找到对你的网站生效的php.ini文件 由于有多个地方都可以设置php的参数,找到正确的配置文件,并进行更改是首先要做的一步。如果你上面的方法建立了php文件来查看其配置参数,则你可以找到“Loaded Configuration File”这一项,以下是个例子:

对于Linux用户,你可以通过执行“php -i | grep Loaded Configuration File”来找到对应的配置文件。而Windows用户,你可以尝试修改你的php安装目录下的php.ini。

2.编辑php.ini 在php.ini中,找到“memory_limit”这一项,如果没有,你可以在文件的尾部自己增加这个参数。以下是一些设置范例

memory_limit = 128M ; 可以将128M改为任何你想设置的值

保存文件

3.重启web 服务器 如果是web服务器使用Apache, 则执行:

httpd restart

有些情况下,你可能不被允许私修改php.ini。比如如果你购买了虚拟主机服务,但是你的服务商确禁止你修改这个文件。那么,你可以需要考虑用其他方法来增加memory_limit的值。

方法2: .htaccess

说明: 这种方法只有在php以Apache模块来执行时才生效。 在你的网站的根目录下找到“.htaccess”文件,如果没有,可以自己创建一个。然后把以下配置放入其中

php_value memory_limit 128M ; 可以将128M改为任何你想设置的值

方法3: 运行时修改php的内存设置

在你的php代码中增加以下命令行即可。

ini_set('memory_limit','128M');

memory_limit修改失败

如果你使用虚拟主机,有可能会出现memory_limit的值修改失败。这个需要联系你的服务商看怎么处理,通常他们限制了可以设置的最大值或者根本就不允许你修改。如果他们的环境真的无法满足你的要求,那么你可能要考虑换一个主机服务商。

 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
生产环境下故障处理一例
现象说明:
    生产环境下,storage服务器上没有安装任何服务(如apache,nginx,IIS等)现在是纯命令行执行PHP跑PHP脚本,在脚本的执行过程中发现(脚本内容含每次取5000个文件然后执行其它操作)速度奇慢,在本地测试时分分钟内搞定的事,在线上要执行2个多小时,经过排查排除掉服务器负载问题、数据库问题、服务器网络问题后,认为可能是php.ini配置文件中的资源限制所引起,于是修改了一下memory_limit将默认值128M修改为1024M后再次执行原脚本,速度得到大幅度提升,现把此参数的含义说明一下。
 
修改后需不需要重启?
    因为PHP没有守护进程一说,理论上你只要修改过以后,就会立即使用新的配置文件。
 
此值设置多大为好?
     建议根据应用需求来设置。物理服务器,如果内存够大的话建议限制内存较大一些如512M,1024M都可,如果是VPS之类的可能限制在128(默认)64M或者以下是比较合适的,特别是有web服务器的时候,一旦开启多个php的fast-cgi,估计服务器都卡的不动了。
 
参数语法
memory_limit integer
    本指令设定了一个脚本所能够申请到的最大内存字节数。
指令作用
    这有助于防止写得不好的脚本消耗光服务器上的可用内存。
 
在phpchina的论坛上,有人这样说:
    memory_limit是设置PHP使用内存时空间,一般设置为内存的四分之一,应该就差不多了。如512M内存设置128M,1G内存设置256M。
    设置太大会影响系统速度,因为系统和数据库及其他程序同样需要内存空间,一般系统和数据库内存空间是自己分配的。
 
附三种修改方法

可能是分词程序的问题。只要搜索的字段达到十个汉字以上,就会出现诸如以下的错误

Fatal error: Allowed memory size of 2345643 bytes exhausted

上网找了方法。有3种办法。

1.直接修改PHP.INI

memory_limit = 16M  ;

但是我修改了没有用。据说是要重启服务器的。但是很显然。我的 是虚拟主机。所以有独立主机的可以这样修改。

2.修改.htaccess

php_value memory_limit 16M

修改后直接出现500错误。可能是主机商限制

3.直接在程序页面上修改。

ini_set(’memory_limit’, ‘16M‘);

效果立竿见影。搞定。

php.ini memory_limit引起的问题的更多相关文章

  1. PHP修改memory_limit的三种办法

     PHP修改memory_limit的三种办法 2010-06-11 10:57:11 分类: 可能是分词程序的问题.只要搜索的字段达到十个汉字以上,就会出现诸如以下的错误 Fatal error: ...

  2. discuz 3.x 核心文件class_core.php解析

    class_core.php是discuz 3.x的核心文件,几乎所有PHP脚本都有引用此文件初始化论坛运行环境.以下解析引用3.2版discuz. line 12-15:常量定义IN_DISCUZ: ...

  3. centos6.4下安装php7+nginx+mariadb环境

    一,安装php71,创建php用户和用户组,并在github下载php7源码#新建php用户和php组# groupadd -r php && useradd -r -g php -s ...

  4. Zabbix3.2安装部署

    zabbix server 前提环境: CentOS6 Lnmp php需要的包(bcmath,mbstring,sockets,gd,libxml,xmlwriter,xmlreader,ctype ...

  5. nginx fastcgi 超时问题解决记录

    在网站后台导数据时,出现超时的情况.经过网上查找资料和试验 主要在下面几个配置的限制 1.php配置 第一种:set_time_limit(0); 永不过期 第二种: php.ini   max_ex ...

  6. php上传文件大小限制

    和你的配置文件有关.改一下PHP配置文件php.ini给你总结下相关配置,自己去改吧 1.php.ini:upload_max_filesize 所上传的文件的最大大小.默认值2M. 2.php.in ...

  7. (转载)PHP的内存限制 Allowed memory size of 134217728 bytes exhausted (tried to allocate 1099 bytes) in

    (转载)http://blog.csdn.net/beyondlpf/article/details/7794028 Fatal error: Allowed memory size of 13421 ...

  8. Centos6.5下安装php

    安装php: yum -y install php 重启httpd服务激活php: /etc/init.d/httpd restart 测试php是否安装完成 vim /var/www/html/in ...

  9. centos 安装amp 运行环境+配置虚拟地址

    一.安装 MySQL 首先来进行 MySQL 的安装.打开超级终端,输入: [root@localhost ~]# yum install mysql mysql-server 安装完毕,让 MySQ ...

随机推荐

  1. sklearn的BaseEstimator、transformerMixin、ClassifierMixin、RegressorMixin、ClusterMixin介绍

    class sklearn.base.BaseEstimator:为所有的estimators提供基类 方法: __init__() 初始化方法 get_params(deep=True) 获取这个估 ...

  2. Access-Control-Allow-Origin 跨域问题

    1.同源.同源策略(Same origin policy) 同源指的是协议,端口,域名全部相同. 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺 ...

  3. javascript callee和caller

    arguments的主要用途是保存参数,但是他还有callee属性. 一:callee指向arguments对象的函数. 示例一: function calture(num) {//阶乘计算 if ( ...

  4. 两个栈实现队列 Python实现

    # coding=utf-8 MAX_LENGTH = 100 SUCCESS = 1 FAIL = 0 ERROR = -1 class Queue(object): stack_fir = Non ...

  5. C编程常错项

    linux系统下C编程一般报错;1,使用sqrt开平方函数未定义,是因为math.h[库,头文件未包含]2,隐式申明与内建函数"XXXX"不兼容;上述问题所在,一般是因为使用exi ...

  6. 委托学习过程及委托、Lambda表达式和匿名方法的关系总结及事件总结

    第一章,当开始学习委托的时候,我们会问什么是委托?为什么要学习委托? 一,什么是委托? 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法, ...

  7. CUDA C Programming Guide 在线教程学习笔记 Part 8

    ▶ 线程束表决函数(Warp Vote Functions) ● 用于同一线程束内各线程通信和计算规约指标. // device_functions.h,cc < 9.0 __DEVICE_FU ...

  8. 转发 DDoS攻防战 (一) : 概述

     岁寒 然后知松柏之后凋也   岁寒 然后知松柏之后凋也 ——论语·子罕 (此图摘自<Web脚本攻击与防御技术核心剖析>一书,作者:郝永清先生)    DDoS,即 Distributed ...

  9. ERROR 1222 (21000): The used SELECT statements have a different number of columns :

    转自:https://blog.csdn.net/linshichen/article/details/52484224

  10. ListView 操作

    TListItem *Item; ; i < ; i++) { Item = ListView1->Items->Add(); Item->Caption = i; } Lis ...