为什么这段代码导致内存耗尽?

时间:2016-09-17 02:06:48

标签: php

服务器上有2个文件。 1,495字节大型JSON文件和包含此代码的PHP文件:

<?php

    $data = json_decode(file_get_contents('data.json'), true);
    for ($i = 0; $i < count($data); $i++) $data[$i][7] = '1';

?>

我收到以下错误。的为什么吗

  

致命错误:允许的内存大小为268435456字节      (尝试分配32个字节)在 /path/to/file/process.php 中      在线 4

(PHP Version 5.4.45)

1 个答案:

答案 0 :(得分:2)

考虑到您的JSON文件只有1495字节,这听起来很奇怪。我猜测您的文件内容是 object 形式({...}),并且您正在进入无限循环。

考虑以下计划:

$json = '{"a":"0"}';
$data = json_decode ($json, true);

for ($i = 0; $i < count($data); $i++)
    $data[$i][7] = '1';

每次运行循环时,都会向$data对象添加一个数组元素,以便count($data)比上一轮更大。计数不断增长,因此循环计数器永远不会达到极限。

解决方案是将调用移出count

$len = count($data);
for ($i = 0; $i < $len; $i++)
    $data[$i][7] = '1';

顺便说一句,使用 array 形式的JSON对象也会发生同样的问题,并略微修改了程序:

$json = '[0]';
$data = json_decode ($json, true);

for ($i = 0; $i < count($data); $i++)
    $data[$i+1][7] = '1';  // Note the +1