关于php:为什么这段代码导致内存耗尽?


Why does this code cause memory exhaustion?

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

1
2
3
4
5
6
<?php

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

?>

我收到以下错误。 为什么?

Fatal error: Allowed memory size of 268435456 bytes exhausted
(tried to allocate 32 bytes) in /path/to/file/process.php
on line 4

(PHP版本5.4.45)


考虑到您的JSON文件只有1495字节,这听起来很奇怪。 我猜你的文件内容是对象形式({...}),而你正在遇到无限循环。

考虑以下程序:

1
2
3
4
5
$json = '{"a":"0"}';
$data = json_decode ($json, true);

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

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

解决方案是将调用移出count循环:

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

顺便说一句,使用数组形式的JSON对象也会发生同样的问题,稍微修改一下程序:

1
2
3
4
5
$json = '[0]';
$data = json_decode ($json, true);

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