【问题标题】:PHP array inserting / manipulation degrading over iterationsPHP数组插入/操作在迭代中退化
【发布时间】:2014-10-30 08:30:40
【问题描述】:

我正在将数据从一个数据库传输到另一个数据库。它们是不同的数据库(mssql 到 mysql),所以我不能直接查询,而是使用 PHP 作为中介。考虑以下代码。出于某种原因,每次它通过 while 循环所花费的时间是前一次的两倍。

$continue = true;
$limit = 20000;

while($continue){
    $i = 0;
    $imp->endTimer();
    $imp->startTimer("Fetching Apps");

    $qry = "THIS IS A BASIC SELECT QUERY";
    $data = $imp->src->dbQuery($qry, array(), PDO::FETCH_ASSOC);

    $inserts = array();
    $continue = (count($data) == $limit);

    $imp->endTimer();
    $imp->startTimer("Processing Apps " . memory_get_usage() );

    if($data == false){
        $continue = false;
    }
    else{
        foreach($data AS $row){

            // THERE IS SOME EXTREMELY BASIC IF STATEMENTS HERE

            $inserts[] = array(
                "paymentID"=>$paymentID,
                "ticketID"=>$ticketID,
                "applicationLink"=>$row{'ApplicationID'},
                "paymentLink"=>(int)($paymentLink),
                "ticketLink"=>(int)($ticketLink),
                "dateApplied"=>$row{'AddDate'},
                "appliedBy"=>$adderID,
                "appliedAmount"=>$amount,
                "officeID"=>$imp->officeID,
                "customerID"=>-1,
                "taxCollected"=>0
            );
            $i++;
            $minID = $row{'ApplicationID'};
        }
    }


    $imp->endTimer();
    $imp->startTimer("Inserting $i Apps");

    if(count($inserts) > 0){
         $imp->dest->dbBulkInsert("appliedPayments", $inserts);
    }

    unset($data);
    unset($inserts);
    echo "Inserted $i Apps<BR>";
}  

我设置的限制无关紧要,处理部分每次需要两倍的时间。我正在记录循环的每一部分,并从旧数据库中选择数据并将其插入新数据库中,这完全不需要时间。 “处理部分”每次都翻倍。为什么?这是日志,如果您对时间戳进行一些快速数学计算,标记为“处理应用程序”的每个步骤所花费的时间是之前的两倍......(我在这一步上稍早停止了它,但它花费了显着最后一次迭代的时间更长)

【问题讨论】:

    标签: php mysql sql-server performance


    【解决方案1】:

    嗯 - 所以我不知道为什么会这样,但是如果我将 while 循环中的所有内容移到一个单独的函数中,它会显着提高性能。我猜这是一个垃圾收集/内存管理问题,并且有一个函数调用结束有助于垃圾收集器知道它可以释放内存。现在,当我记录内存使用情况时,内存使用情况在两次调用之间保持不变而不是增长... Dirty php...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多