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

修改PHP的memory

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

761

主题

775

帖子

3万

积分

董事

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

积分
32849
发表于 19-3-4 18:28:55 | 显示全部楼层 |阅读模式      紫钻仅向指定用户开放  
在运行PHP程序,通常会遇到“Fatal Error: Allowed memory size of xxxxxx bytesexhausted”的错误,这个意味着PHP脚本使用了过多的内存,并超出了系统对其设置的允许最大内存。解决这个问题,首先需要查看你的程序是否分配了过多的内存,在程序没有问题的情况下,你可以通过一下方法来增加PHP的内存限制(memory_limit)。) i. Y# \4 l, _* ?" a; h- U" U9 O5 O
检查php的内存限制值
1 S+ `! p1 I! C4 a' U为了查看这个值,你需要建立一个空的php文件,比如view-php-info.php。然后将一下代码贴到里面。
5 V; N! P/ C7 Z- A6 E
7 `6 R* L  o& d# D' D/ ?将这个脚本放到你的Web服务器上,然后在浏览器中调用它。这时你可以看到你的PHP环境配置的信息,其中有一部分是关于“memory_limit”的,如下图:7 @2 _9 s; o2 b

4 E3 I2 P/ b' ` 745535c7cfd9a9b08f.png 0 P7 G$ v2 }. T, d$ v
注:你可以用这种方法来查看php的其他参数设置,不仅仅是memory_limit
$ \/ f; s+ q% T. a
# @% y8 s2 L& H; c) Amemory_limit应该设为多少?
* R. b: f9 j5 y3 b+ ~6 S这个完全依赖于你的应用的要求。比如Wordpress,运行起核心代码需要32MB。Drupal6则要求这个值最小为16MB,并推荐设置为32MB。如果你又安装不少的插件(plugins),尤其是那些要进行图像处理的模块,那么你可能需要128MB或更高的内存。9 v5 X6 t, H, W; q( ~) V( g1 M
如何设置memory_limit8 y# L7 l) _, f* m" z' t  B

6 K  N) J5 y: a' E& w4 \$ h5 V3 V方法1: php.ini强烈推荐优先使用此方法!!% U" I( o8 P7 i8 u% k$ b6 T
最简单或常用的方法是修改php.ini! p: s0 X& ^+ q( n5 J3 {
1.首先找到对你的网站生效的php.ini文件由于有多个地方都可以设置php的参数,找到正确的配置文件,并进行更改是首先要做的一步。如果你上面的方法建立了php文件来查看其配置参数,则你可以找到“LoadedConfiguration File”这一项,以下是个例子:; Y1 K$ |/ r2 w9 b" L1 Y" N

. G8 M' R4 c& s0 x 604095c7cfda18937e.png 4 r+ S  w! O/ n

7 o+ ~4 ]2 |. L- N9 {9 z" A8 f5 x: P6 Z8 o* y
对于Linux用户,你可以通过执行“php -i | grep Loaded ConfigurationFile”来找到对应的配置文件。而Windows用户,你可以尝试修改你的php安装目录下的php.ini。4 u9 ]0 J. d6 E2 H
2.编辑php.ini在php.ini中,找到“memory_limit”这一项,如果没有,你可以在文件的尾部自己增加这个参数。以下是一些设置范例
  k, P. u: |( q9 C
  1. memory_limit = 128M ; 可以将128M改为任何你想设置的值
复制代码

  ^" A( v& R9 h" z! C保存文件
+ a4 ?) r9 i+ Q& B9 M6 z3.重启web 服务器 如果是web服务器使用Apache, 则执行:/ n7 q' |( Y- i5 H7 |
httpd restart
1 f* [; ]1 h4 B0 |有些情况下,你可能不被允许私修改php.ini。比如如果你购买了虚拟主机服务,但是你的服务商确禁止你修改这个文件。那么,你可以需要考虑用其他方法来增加memory_limit的值。
& T  k  P8 A' h+ S( `1 p7 I3 c4 e% z" p" }# ?' x5 j
方法2: .htaccess(不推荐)% t0 s: s. }* U6 g5 L% s
说明: 这种方法只有在php以Apache模块来执行时才生效。在你的网站的根目录下找到“.htaccess”文件,如果没有,可以自己创建一个。然后把以下配置放入其中/ n" R# E% j. T/ e
php_value memory_limit 128M ; 可以将128M改为任何你想设置的值
; F; }% [9 a! Y7 V
2 S! W3 V% {& g方法3: 运行时修改php的内存设置, i4 R/ H: y( N$ P% u6 a
在你的php代码中增加以下命令行即可。
! d3 Y- Y4 a8 c0 T/ v7 b
  1. ini_set(‘memory_limit’,’128M’);
复制代码
memory_limit修改失败
9 h3 [5 `- {% D如果你使用虚拟主机,有可能会出现memory_limit的值修改失败。这个需要联系你的服务商看怎么处理,通常他们限制了可以设置的最大值或者根本就不允许你修改。如果他们的环境真的无法满足你的要求,那么你可能要考虑换一个主机服务商。; b/ H7 B! T% v# s
PHP5中,对于memory_limit的设定已经从以往的8M扩大到128M的上限。
2 ?; e5 ?7 T5 Y# Q! m1 i
# A0 H+ N+ o# b对于配置中的定义解释是:/ t+ U; ^: S, I  ~" M2 [
  1. memory_limit = 128M ; Maximum amount of memory a script may consume(128MB)
复制代码
最大单线程的独立内存使用量。也就是一个web请求,给予线程最大的内存使用量的定义。
, W. v/ w* a) u( t+ m: G7 ~/ Y; ]现有的大部分网站或者论坛应用中,应用软件的配备一般都是以如下的形式搭建:
8 E% J. q4 n( {! ]  K
  1. Nginx(Apache) PHP Memcache Mysql
复制代码
对于以上的应用软件的采用,优点我就不再多说。但对于Memcache的使用就是为了减少对于数据库的访问的频率的降低,也是提高服务响应的一种办法。但是对于memcache和数据库的数据存储有区别的是,memcache的数据并不是以上数据的形式存储在内存中,而是抽象化了之后以字符的形式,hash表的形式存储在内存之中。这样的存储区别导致,每次memcache的数据抽取必须全部数据反序拟化一次,将所有的数据导入进独立的单一线程中,然后第二部才是进行过滤和抽取你所需要的数据。: s- c" l4 }4 Q  m' Z% l7 M& q5 }
在应用过程中,如果是读取数据库的数据,大家应该知道,优化的办法应该是在SQL语句中比保证第一次过滤尽量是提高准确性,只取需要的字段,不要全部所有字段取出之后再在应用中过滤得到自己想要的字段,这样对于服务器的负载会有本质的区别。
) m6 o( Y6 d6 ^% L6 G如果采用memcache,必然做不到数据库在在第一次就精确过滤这点目标。那么就需要在开始设计表的同时就需要考虑到这点,尽量保证被memcache数据表尽量保证数据的较少,可以多分表来完成。, ], w) c6 {1 `6 }8 {3 f
memory_limit的内存分配,标配是128M。
. M! h3 J4 z  r5 f$ _5 ~/ F一旦独立的线程超过了128M,那PHP会报错:
' }& z3 F4 D( F8 \
  1. Fatal error: Allowed memory size of 33554432 bytes
复制代码
对于8G内存的服务器,如果同时并发的响应达到50,每个都是128M的峰值,那估计也是服务器会卡死的时候。# S& p; L3 _9 [; p8 ~* P3 S
尽量降低128M的内存配置,如果调整至64M,服务器的负载基本能下降一半左右,如果能调整至32M效果更好。
9 e9 M2 |6 T( t* z/ P但是对于应用的要求就更高,很多表建立初期就没有考虑到这个问题,如果你要采用memcache作为数据的存储,必须提前完成优化数据表的设计部署,降低独立线程PHP的内存使用量,服务器的响应和负载降低的就不仅仅是几个百分点的效果了。 6 W& h, m& b+ {9 f
网站简介

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