【问题标题】:PHP How to Optimize foreach process for memory usage?PHP如何优化foreach进程的内存使用?
【发布时间】:2017-08-15 02:04:48
【问题描述】:

我有一些关于在 PHP 上使用 foreach 的内存问题。 有一个进程使用了​​这么多内存。该过程只是从 WebService 中获取数据并插入到数据库中。但是数据很大,几乎有上千条数据。它真的很饿,几乎要吃掉 2g 的 ram。 反正有优化我的代码吗?我试过 unset() 和 = NULL 但没有释放内存。 这是我的代码,我正在使用 codeigniter:

$proxy = $this->proxy;
$token = $this->token;
$table = 'nilai';

$qk =$this->db->query("SELECT id_reg_pd from $databaseakm");
$tampan = $qk->result();


foreach($tampan as $keyz0 => $data0){


    $id_reg_pd = $data0->id_reg_pd;
        $filter3 = "p.id_reg_pd='$id_reg_pd'";
        $order3= "";
        $limit3 = 500;
        $offset3 = 0;
        $tampan3 = $proxy->GetRecordset($token, $table, $filter3, $order3, $limit3, $offset3);


$_datas = array_chunk($tampan3["result"], 50);      

foreach($_datas as $key => $data)

    {
        $this->db->trans_start();
        $this->db->query("UPDATE temp_tabel SET status_isi = 2 WHERE nama_tabel = '$databasenilai'");
        $this->db->insert_batch($databasenilai, $data);
        $this->db->trans_complete();
        $tampan3 = NULL;
        $data = NULL;
        unset($tampan3);
        unset($data);
    }   
$tampan3 = NULL;
        $data = NULL;
        unset($tampan3);
        unset($data);
}
$tampan3 = NULL;
        $data = NULL;
        unset($tampan3);
        unset($data);

【问题讨论】:

  • 删除unsets,在这种情况下他们将无济于事
  • 好的,我会这样做的
  • 您可以创建一个主脚本,使用offset 作为参数多次调用子脚本,而子脚本在主查询中使用offsetSELECT id_reg_pd from $databaseakm LIMIT $offset, 100跨度>
  • 数百?这没什么
  • @ConstantinGALBENU 好的,我要试试。

标签: php codeigniter-3


【解决方案1】:

返回一个对象并使用 while 循环而不是 for each。对于每个尝试将整个数据加载到内存中并对其进行循环,while 循环将一次执行一个并获取下一个

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-08
    • 2010-11-09
    • 2014-05-05
    • 1970-01-01
    • 2015-12-09
    • 2011-09-06
    • 2014-04-25
    • 1970-01-01
    相关资源
    最近更新 更多