设为首页 收藏本站
查看: 919|回复: 0

[经验分享] php.ini memory_limit引起的问题

[复制链接]

尚未签到

发表于 2017-3-29 09:15:02 | 显示全部楼层 |阅读模式
  原文:http://blog.itechol.com/space-33-do-blog-id-6815.html


故障现象   
 
     在运行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”的, 如下图:
DSC0000.png

    注:你可以用这种方法来查看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”这一项,以下是个例子:
DSC0001.png

 
对于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‘);


效果立竿见影。搞定。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-356812-1-1.html 上篇帖子: PHP调试工具的使用XDEBUG 下篇帖子: PHP 正则表达式资料
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表