腾讯云网站解决方案帮您轻松应对建站成本高/网络不稳等常见问题

修改PHP的memory

0
回复
431
查看
[复制链接]

690

主题

704

帖子

3万

积分

董事

Rank: 72Rank: 72Rank: 72Rank: 72Rank: 72Rank: 72Rank: 72Rank: 72Rank: 72Rank: 72Rank: 72Rank: 72Rank: 72Rank: 72Rank: 72Rank: 72Rank: 72Rank: 72

积分
31818
     紫钻仅向指定用户开放  
发表于 19-3-4 18:28:55 | 显示全部楼层 |阅读模式
在运行PHP程序,通常会遇到“Fatal Error: Allowed memory size of xxxxxx bytesexhausted”的错误,这个意味着PHP脚本使用了过多的内存,并超出了系统对其设置的允许最大内存。解决这个问题,首先需要查看你的程序是否分配了过多的内存,在程序没有问题的情况下,你可以通过一下方法来增加PHP的内存限制(memory_limit)。
* N; s; h% L  G/ _5 A检查php的内存限制值0 C9 d- H9 v/ }
为了查看这个值,你需要建立一个空的php文件,比如view-php-info.php。然后将一下代码贴到里面。
+ r/ y+ g5 a; n' Z* M
: ^9 |  G; h, C% v; w) E将这个脚本放到你的Web服务器上,然后在浏览器中调用它。这时你可以看到你的PHP环境配置的信息,其中有一部分是关于“memory_limit”的,如下图:
2 H+ \- A  f' \+ {1 O% F$ ~4 Q6 i3 J% Y5 l( ]4 f, M9 X/ _: @
7 [8 P% d" h0 [9 b' U+ Y; j
注:你可以用这种方法来查看php的其他参数设置,不仅仅是memory_limit
$ P) y0 d' K/ N' B4 T+ e; _9 U8 z4 ^) S* e& X! l* o' k, i
memory_limit应该设为多少?
8 g8 P5 s/ s# Z# ~8 r6 u8 }, V# c这个完全依赖于你的应用的要求。比如Wordpress,运行起核心代码需要32MB。Drupal6则要求这个值最小为16MB,并推荐设置为32MB。如果你又安装不少的插件(plugins),尤其是那些要进行图像处理的模块,那么你可能需要128MB或更高的内存。
# p) c- j+ o' c1 D2 G  d6 a如何设置memory_limit" k8 j. D4 R/ S, i8 ?$ w" N  }

) v) q, U& X; L! W方法1: php.ini强烈推荐优先使用此方法!!
) o& _) k' W* x% p/ R" u% m最简单或常用的方法是修改php.ini8 S0 Y; Q$ P9 x( K& d/ C
1.首先找到对你的网站生效的php.ini文件由于有多个地方都可以设置php的参数,找到正确的配置文件,并进行更改是首先要做的一步。如果你上面的方法建立了php文件来查看其配置参数,则你可以找到“LoadedConfiguration File”这一项,以下是个例子:: \$ }4 e4 N/ H% R: h  X1 _
; K5 y0 r. t+ |6 J

* P6 a& ]& T! G! f3 b' {
( d/ |# m1 \) e6 Y& i0 a2 v$ o7 q: O2 b" O) \8 X
对于Linux用户,你可以通过执行“php -i | grep Loaded ConfigurationFile”来找到对应的配置文件。而Windows用户,你可以尝试修改你的php安装目录下的php.ini。# d% E0 E" @8 U# x2 T5 U3 O" `
2.编辑php.ini在php.ini中,找到“memory_limit”这一项,如果没有,你可以在文件的尾部自己增加这个参数。以下是一些设置范例: [9 N7 T1 y% ~$ P. n- ~, Z3 T
  1. memory_limit = 128M ; 可以将128M改为任何你想设置的值
复制代码
! k7 F# \9 J1 I$ U/ m' h
保存文件: ]% Z* ]/ P- e; |
3.重启web 服务器 如果是web服务器使用Apache, 则执行:
- T$ m  D: r" H/ ehttpd restart* I1 u+ u8 f/ A5 M' A( d2 }8 B
有些情况下,你可能不被允许私修改php.ini。比如如果你购买了虚拟主机服务,但是你的服务商确禁止你修改这个文件。那么,你可以需要考虑用其他方法来增加memory_limit的值。
! A5 I' s) m" O9 D3 G. ^
5 C+ J( [$ c7 ~8 t' Z方法2: .htaccess(不推荐)
: ]1 c" k) K( X/ E9 V- |. E3 J3 Z9 E" s说明: 这种方法只有在php以Apache模块来执行时才生效。在你的网站的根目录下找到“.htaccess”文件,如果没有,可以自己创建一个。然后把以下配置放入其中
( q2 {* n, Q0 f  C3 y' k8 ?php_value memory_limit 128M ; 可以将128M改为任何你想设置的值* C: A; v! N" I) _

3 N+ y9 i  q5 b方法3: 运行时修改php的内存设置9 Z- P6 w) [  p2 B8 `5 K  I$ R
在你的php代码中增加以下命令行即可。3 P# i& ~& V7 \* d
  1. ini_set(‘memory_limit’,’128M’);
复制代码
memory_limit修改失败% f+ o# o/ k1 Q7 v1 P
如果你使用虚拟主机,有可能会出现memory_limit的值修改失败。这个需要联系你的服务商看怎么处理,通常他们限制了可以设置的最大值或者根本就不允许你修改。如果他们的环境真的无法满足你的要求,那么你可能要考虑换一个主机服务商。
9 Y7 ]% ~  e6 O1 l1 p/ ^) dPHP5中,对于memory_limit的设定已经从以往的8M扩大到128M的上限。* x% }/ D+ p3 g& b+ M* I
, s; V' m  g4 y
对于配置中的定义解释是:
' ?# R% L# H7 A4 w9 F6 T( s
  1. memory_limit = 128M ; Maximum amount of memory a script may consume(128MB)
复制代码
最大单线程的独立内存使用量。也就是一个web请求,给予线程最大的内存使用量的定义。
' T$ o5 o/ @% M, N( t4 D1 V现有的大部分网站或者论坛应用中,应用软件的配备一般都是以如下的形式搭建:# t. S7 p; w9 _! O
  1. Nginx(Apache) PHP Memcache Mysql
复制代码
对于以上的应用软件的采用,优点我就不再多说。但对于Memcache的使用就是为了减少对于数据库的访问的频率的降低,也是提高服务响应的一种办法。但是对于memcache和数据库的数据存储有区别的是,memcache的数据并不是以上数据的形式存储在内存中,而是抽象化了之后以字符的形式,hash表的形式存储在内存之中。这样的存储区别导致,每次memcache的数据抽取必须全部数据反序拟化一次,将所有的数据导入进独立的单一线程中,然后第二部才是进行过滤和抽取你所需要的数据。2 `, I- a. G2 C$ y$ U$ P
在应用过程中,如果是读取数据库的数据,大家应该知道,优化的办法应该是在SQL语句中比保证第一次过滤尽量是提高准确性,只取需要的字段,不要全部所有字段取出之后再在应用中过滤得到自己想要的字段,这样对于服务器的负载会有本质的区别。1 }  N4 ]: L  @( y, {; z
如果采用memcache,必然做不到数据库在在第一次就精确过滤这点目标。那么就需要在开始设计表的同时就需要考虑到这点,尽量保证被memcache数据表尽量保证数据的较少,可以多分表来完成。
2 H( x0 k5 \% |& imemory_limit的内存分配,标配是128M。$ D1 X8 d3 i9 R7 s0 a  r
一旦独立的线程超过了128M,那PHP会报错:
* |) \! B2 h3 W# n8 m+ ^
  1. Fatal error: Allowed memory size of 33554432 bytes
复制代码
对于8G内存的服务器,如果同时并发的响应达到50,每个都是128M的峰值,那估计也是服务器会卡死的时候。
7 j/ w# q0 c- {' j) Y7 G尽量降低128M的内存配置,如果调整至64M,服务器的负载基本能下降一半左右,如果能调整至32M效果更好。
7 @4 Q& `* g6 [! k但是对于应用的要求就更高,很多表建立初期就没有考虑到这个问题,如果你要采用memcache作为数据的存储,必须提前完成优化数据表的设计部署,降低独立线程PHP的内存使用量,服务器的响应和负载降低的就不仅仅是几个百分点的效果了。 1 g; @5 J' Q8 h: l( O

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

qiuqiufa.com

网站简介

球球发,是一家 Discuz! 商业插件、风格模板、网站源码、 Discuz!运营维护技术等于一体的交流分享网站,全站95%的资源都是免费下载,对于资源我们是每天更新,每个亲测资源最新最全---球球发(如果我们有侵犯了您权益的资源请联系我们删除