php数组的限制于memory_limit的关系

molaifeng
博客专家认证
2013-02-21 05:25:49
前几天在服务器上处理一个大文件时,遇到了一个问题


PHP Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 10255856 bytes) in /usr/local/asg/www/scripts/sync.php on line 641



在网上看了下,说是跟php.ini里设置的memory_limit有关,因为那个脚本中有个函数,是把文件的每行经过处理后放入一个数组的,那个文件有46419行,我想可能是超过了限制吧,于是我在windos系统做了下测试


$arr = array();
for($i=0;$i=1590000;$i++) {
$arr[] = $i;
}

echo count($arr);



php.ini中的memory_limit设置为

; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 128M


运行后,显示

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 24 bytes) in D:\server\www\02\array.php on line 5



之后,我便把数组调小了些


$arr = array();

for($i=0;$i<1550000;$i++) {
$arr[] = $i;
}


echo count($arr);


这次可以显示了,长度为150000

接着我又改了下php.ini中memory_limit大小


; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 512M


运行了下,之前报错的那个数据现在可以显示了,数组的长度为1590000

我想问下,php.ini里的memory_limit和数组长度是什么关系,当然了从问题上看,可以知道前者的大小决定后者的长度,如何根据前者的大小测试数组长度的上限呢?
...全文
1990 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
molaifeng 2013-02-22
  • 打赏
  • 举报
回复
哦,谢谢朋友们的回答!!!
helloyou0 2013-02-22
  • 打赏
  • 举报
回复
是说企图再分配24个字节时,超过了128M的内存限制, 所以失败了.
引用 4 楼 molaifeng 的回复:
是不是从字面上来理解,允许使用的134217728字节内存已经耗尽,试图分配24个字节,也就是再分配24字节的内存就可以?
molaifeng 2013-02-21
  • 打赏
  • 举报
回复
引用 2 楼 xuzuning 的回复:
我想看了这个,你应该知道点什么了PHP code?12345678910$t = 0;echo memory_get_usage() - $t, ' ',$t = memory_get_usage(), PHP_EOL;$a = array();echo memory_get_usage() - $t, ' ', $t = memory_get_usage(), PHP_……
我运行了下,我机子上显示

323904 323904
168 324072
80 324152
80 324232
80 324312
右边的减去左边的就是上个内存的使用情况 我还想问下,那个报警是想说明说明呢

 Allowed memory size of 134217728 bytes exhausted (tried to allocate 24 bytes)
是不是从字面上来理解,允许使用的134217728字节内存已经耗尽,试图分配24个字节,也就是再分配24字节的内存就可以?
an9ryfr09 2013-02-21
  • 打赏
  • 举报
回复
数组大概占多少内存,可以估算出来。比如你存放的是4字节的int数,数组有1000个元素就是4*1000字节。如果是字符串,按字符估算个平均值既可。 当然memory_limit设置的值不光是你一个数组所占用的内存数,php本身进程启动,以及加载那些扩展、还有你程序中其他地方也需要占用内存。
xuzuning 2013-02-21
  • 打赏
  • 举报
回复
我想看了这个,你应该知道点什么了
$t = 0;
echo memory_get_usage() - $t, ' ',$t = memory_get_usage(), PHP_EOL;
$a = array();
echo memory_get_usage() - $t, ' ', $t = memory_get_usage(), PHP_EOL;
$a[] = 1;
echo memory_get_usage() - $t, ' ', $t = memory_get_usage(), PHP_EOL;
$a[] = 2;
echo memory_get_usage() - $t, ' ', $t = memory_get_usage(), PHP_EOL;
$a[] = 3;
echo memory_get_usage() - $t, ' ', $t = memory_get_usage(), PHP_EOL;
dappbujiujiu 2013-02-21
  • 打赏
  • 举报
回复
跟长度没有关系。。 是你脚本执行时使用的内存有关

21,882

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧