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

修改PHP的memory

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

764

主题

778

帖子

3万

积分

董事

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

积分
32970
发表于 19-3-4 18:28:55 | 显示全部楼层 |阅读模式      紫钻仅向指定用户开放  
在运行PHP程序,通常会遇到“Fatal Error: Allowed memory size of xxxxxx bytesexhausted”的错误,这个意味着PHP脚本使用了过多的内存,并超出了系统对其设置的允许最大内存。解决这个问题,首先需要查看你的程序是否分配了过多的内存,在程序没有问题的情况下,你可以通过一下方法来增加PHP的内存限制(memory_limit)。5 N% e2 g# ^- Y9 E4 b
检查php的内存限制值$ Q) h: }$ M# u
为了查看这个值,你需要建立一个空的php文件,比如view-php-info.php。然后将一下代码贴到里面。
7 f- s  o5 \$ a
$ o/ ]* {/ H, p  q8 E将这个脚本放到你的Web服务器上,然后在浏览器中调用它。这时你可以看到你的PHP环境配置的信息,其中有一部分是关于“memory_limit”的,如下图:; _, y: `0 G" [% p4 y$ |/ I
$ t& J' b9 m: z) j- ?: }
745535c7cfd9a9b08f.png 6 o+ I2 ~, l' D+ o) o! d( `, n
注:你可以用这种方法来查看php的其他参数设置,不仅仅是memory_limit
4 e' J5 x7 A# ]$ m7 o- Q* g# K8 H% j: K9 C' F0 J" ^
memory_limit应该设为多少?
" u: y' D$ ]' s1 W) W这个完全依赖于你的应用的要求。比如Wordpress,运行起核心代码需要32MB。Drupal6则要求这个值最小为16MB,并推荐设置为32MB。如果你又安装不少的插件(plugins),尤其是那些要进行图像处理的模块,那么你可能需要128MB或更高的内存。
) D) Y& y$ m, y7 k  b; e% _# ?如何设置memory_limit" L9 I; T, E4 {/ d- Y+ D8 n& q

& H- S+ Q/ v" k( k* M0 I方法1: php.ini强烈推荐优先使用此方法!!
% Y* `( m' D. n( D- d最简单或常用的方法是修改php.ini
! o1 ]0 v" k8 X9 P1 Y! J4 L9 f' C1.首先找到对你的网站生效的php.ini文件由于有多个地方都可以设置php的参数,找到正确的配置文件,并进行更改是首先要做的一步。如果你上面的方法建立了php文件来查看其配置参数,则你可以找到“LoadedConfiguration File”这一项,以下是个例子:
- H: C' @" P% d) T6 w6 u4 j; o* Z8 U; {  {1 w
604095c7cfda18937e.png
3 m9 k9 K+ m! _" V# d6 x
0 O3 L0 X+ ]# ]7 t
4 y. s: I3 l, W. `7 J0 b/ Z; c- N对于Linux用户,你可以通过执行“php -i | grep Loaded ConfigurationFile”来找到对应的配置文件。而Windows用户,你可以尝试修改你的php安装目录下的php.ini。2 Z. H' [9 D8 o3 X6 j
2.编辑php.ini在php.ini中,找到“memory_limit”这一项,如果没有,你可以在文件的尾部自己增加这个参数。以下是一些设置范例: Z9 e8 ~+ R( P
  1. memory_limit = 128M ; 可以将128M改为任何你想设置的值
复制代码
2 |6 S) A4 z) o: c3 T
保存文件& m' q# T8 P  K/ d
3.重启web 服务器 如果是web服务器使用Apache, 则执行:! z3 {6 W$ t( }' q' p! `( W$ \
httpd restart/ S+ g& l% k- ]7 A1 D* ?: M
有些情况下,你可能不被允许私修改php.ini。比如如果你购买了虚拟主机服务,但是你的服务商确禁止你修改这个文件。那么,你可以需要考虑用其他方法来增加memory_limit的值。4 f6 h- `8 W; l8 \

1 N! n' B' G( F0 k* S8 w& w, V& ]; k方法2: .htaccess(不推荐): i. e) M% x' k5 H
说明: 这种方法只有在php以Apache模块来执行时才生效。在你的网站的根目录下找到“.htaccess”文件,如果没有,可以自己创建一个。然后把以下配置放入其中& r7 _$ `7 B3 i
php_value memory_limit 128M ; 可以将128M改为任何你想设置的值
0 f! L3 u% ^8 r( R: }" Q5 l" A! K6 @/ \& E4 g) Q
方法3: 运行时修改php的内存设置
& O6 K- ~. V$ |# B在你的php代码中增加以下命令行即可。
$ F( k) r8 }8 n- U
  1. ini_set(‘memory_limit’,’128M’);
复制代码
memory_limit修改失败
( s* A6 g, T$ N: N如果你使用虚拟主机,有可能会出现memory_limit的值修改失败。这个需要联系你的服务商看怎么处理,通常他们限制了可以设置的最大值或者根本就不允许你修改。如果他们的环境真的无法满足你的要求,那么你可能要考虑换一个主机服务商。
! t" d/ R/ }5 ]) P' jPHP5中,对于memory_limit的设定已经从以往的8M扩大到128M的上限。  y4 x& }8 M+ X6 v1 a2 j
: U) _, w5 `# T7 _- C; q* Y
对于配置中的定义解释是:+ N5 h7 y5 ^! [( \
  1. memory_limit = 128M ; Maximum amount of memory a script may consume(128MB)
复制代码
最大单线程的独立内存使用量。也就是一个web请求,给予线程最大的内存使用量的定义。
# X9 H- r  t. G4 g2 V5 }% o+ k现有的大部分网站或者论坛应用中,应用软件的配备一般都是以如下的形式搭建:6 ~1 F" Q0 ^3 W
  1. Nginx(Apache) PHP Memcache Mysql
复制代码
对于以上的应用软件的采用,优点我就不再多说。但对于Memcache的使用就是为了减少对于数据库的访问的频率的降低,也是提高服务响应的一种办法。但是对于memcache和数据库的数据存储有区别的是,memcache的数据并不是以上数据的形式存储在内存中,而是抽象化了之后以字符的形式,hash表的形式存储在内存之中。这样的存储区别导致,每次memcache的数据抽取必须全部数据反序拟化一次,将所有的数据导入进独立的单一线程中,然后第二部才是进行过滤和抽取你所需要的数据。
: l. L$ ]2 \: q' O8 B4 b在应用过程中,如果是读取数据库的数据,大家应该知道,优化的办法应该是在SQL语句中比保证第一次过滤尽量是提高准确性,只取需要的字段,不要全部所有字段取出之后再在应用中过滤得到自己想要的字段,这样对于服务器的负载会有本质的区别。
; M5 q. c. m5 h( w* }如果采用memcache,必然做不到数据库在在第一次就精确过滤这点目标。那么就需要在开始设计表的同时就需要考虑到这点,尽量保证被memcache数据表尽量保证数据的较少,可以多分表来完成。2 p5 D; e' k( b0 a6 `" _2 T" S1 o
memory_limit的内存分配,标配是128M。' R  ^2 J8 K9 ^
一旦独立的线程超过了128M,那PHP会报错:# D: m# w# m7 b9 F" M
  1. Fatal error: Allowed memory size of 33554432 bytes
复制代码
对于8G内存的服务器,如果同时并发的响应达到50,每个都是128M的峰值,那估计也是服务器会卡死的时候。
1 o( l5 T0 [# `# m7 w& L尽量降低128M的内存配置,如果调整至64M,服务器的负载基本能下降一半左右,如果能调整至32M效果更好。
! h5 x4 v  {7 ?' c7 Z但是对于应用的要求就更高,很多表建立初期就没有考虑到这个问题,如果你要采用memcache作为数据的存储,必须提前完成优化数据表的设计部署,降低独立线程PHP的内存使用量,服务器的响应和负载降低的就不仅仅是几个百分点的效果了。 * O2 R  s" X' g4 E( W
网站简介

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