Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在php中更新循环中的数组值时内存超出问题_Php_Loops_Memory Leaks_Variable Declaration - Fatal编程技术网

在php中更新循环中的数组值时内存超出问题

在php中更新循环中的数组值时内存超出问题,php,loops,memory-leaks,variable-declaration,Php,Loops,Memory Leaks,Variable Declaration,情况是我有一个15000条记录的数组,每条记录有67个键值对值。现在我想使用trim、str_replace或type cast更新所有值,但我得到一个php内存泄漏错误。我不明白为什么会这样。我的数组格式如下 Array ( [0] => Array ( [id] => 1 [parent_id] => 1 [login] => 123 [login_

情况是我有一个15000条记录的数组,每条记录有67个键值对值。现在我想使用trim、str_replace或type cast更新所有值,但我得到一个php内存泄漏错误。我不明白为什么会这样。我的数组格式如下

Array
(
    [0] => Array
        (
            [id] => 1
            [parent_id] => 1
            [login] => 123
            [login_nickname] => 
            [password] => 123
            [subuser] => 0
            [subuser_id] => 
            [email] => usersemail@email.com
        ),
       [1] => Array
        (
            [id] => 1
            [parent_id] => 1
            [login] => 123
            [login_nickname] => 
            [password] => 123
            [subuser] => 0
            [subuser_id] => 
            [email] => anotheruser@email.com
        )
)
foreach($member_list as $index=>$member){
   foreach($member as $key=>$value){
      $member_list[$index][$key] = str_replace(array("\n", "\t", "\r"), " ", trim($value));
   }
}
在这个数组中,我有一些字段,比如comments、address,我希望它们是trim、str_replace,还有一些字段,比如branchs(数组),我希望在object中输入cast。但是当我这样做的时候,我得到了一个像这样的记忆错误

Array
(
    [0] => Array
        (
            [id] => 1
            [parent_id] => 1
            [login] => 123
            [login_nickname] => 
            [password] => 123
            [subuser] => 0
            [subuser_id] => 
            [email] => usersemail@email.com
        ),
       [1] => Array
        (
            [id] => 1
            [parent_id] => 1
            [login] => 123
            [login_nickname] => 
            [password] => 123
            [subuser] => 0
            [subuser_id] => 
            [email] => anotheruser@email.com
        )
)
foreach($member_list as $index=>$member){
   foreach($member as $key=>$value){
      $member_list[$index][$key] = str_replace(array("\n", "\t", "\r"), " ", trim($value));
   }
}
Fatel错误:允许的内存大小为134217728字节,在var/www/html/myproject/application/models/Member.php联机28

仅供参考:当我使用这些功能(修剪、str_替换、键入cast等)在循环中回显这些值时,循环工作正常,并成功打印其值

我不明白是什么问题,请帮帮我

我的foreach循环是这样的

Array
(
    [0] => Array
        (
            [id] => 1
            [parent_id] => 1
            [login] => 123
            [login_nickname] => 
            [password] => 123
            [subuser] => 0
            [subuser_id] => 
            [email] => usersemail@email.com
        ),
       [1] => Array
        (
            [id] => 1
            [parent_id] => 1
            [login] => 123
            [login_nickname] => 
            [password] => 123
            [subuser] => 0
            [subuser_id] => 
            [email] => anotheruser@email.com
        )
)
foreach($member_list as $index=>$member){
   foreach($member as $key=>$value){
      $member_list[$index][$key] = str_replace(array("\n", "\t", "\r"), " ", trim($value));
   }
}

此错误发生在此循环中。

此问题基本上与PHP脚本消耗大量内存有关。在您的情况下,由于数据量太大,即使是504网关超时问题也会非常频繁地出现。您应该使用批处理(后台处理)技术,或者使用CLI或curl执行脚本。这两种技术在PHP世界中都是经过充分验证的方法,用于处理大型运行作业

问题是stru_replace实际上是一种非常昂贵的方法。如果您分析代码(使用xhprof()之类的工具),您将看到该方法在PHP CPU使用方面的成本有多高。最重要的是(我认为这是您真正的问题),当您循环并分配值时,您的内存会加倍,这是您最有可能遇到问题的地方(在回显值时,您看不到这一问题)

如果仍然需要这样运行循环,请增加内存限制。您可以在php.ini文件(然后重新启动Apache)中执行此操作,也可以在脚本开头放置以下代码:

ini_set('memory_limit','256M')
这将使PHP的可用内存增加到256MB。您可能需要添加更多内存,但最终,您将有足够的内存来处理整个数组

在另一个注释中,考虑修复进入你的数据库中的数据,当然,除非你只是为了特定的目的而这样做。

---只是用内存使用的例子来更新一下---

例1:

在上运行以下代码大约需要43000字节

<?php
$x = [];
// create array.
$i = 0;
for($i=0; $i<=1000; $i++) {
    $x[$i]['id'] = $i;
    $x[$i]['name'] = rand(10909090,999999999999999);
    $x[$i]['time'] = time();
    $x[$i]['readable'] = date('r', time()); 
}

$start = memory_get_usage();
foreach ($x as $k => $v) {
    foreach ($v as $key => $val) {
        $x[$k][$key] = str_replace(1,2, $val);
    }
}
$end = memory_get_usage();
$used = $end - $start;

var_dump('Memory consumed: ' . $used);

您需要显示您的代码。它是否来自数据库?将其分块您可以使用内存获取使用情况,以查看在构建阵列时使用情况().@Dagon,是的,这个数组来自数据库,但在这个问题中,我只是展示了我数组的格式。@Barmar,我添加了我编解码器的一部分。你能给我提供一些例子来解决我的问题吗?为什么它会在内存上加倍?每次他替换字符串时,旧字符串都会变成垃圾,它的内存应该回收。PHP使用写时复制,因此,除非修改其中一个变量,否则分配变量不会产生副本。我不确定PHP背后的C代码是如何工作的,但根据我的经验,只有在脚本终止后,内存才会被回收。当分配变量时,他会耗尽内存——当他回音时,他不会——这意味着他在消耗内存。问题是m非常简单。我将尝试运行一些测试,看看是否可以生成一些统计数据。回送时,请参阅和以获取代码。在转储结束时查找内存使用情况。在赋值时,请参阅和以进行比较。t1示例的内存使用率要高得多,超过55倍。有关PHP垃圾收集的详细信息,请参阅。我可以这样做。但是,我的证明布丁中的s(或示例,如上所述)。