Bir döngü içinde sorguları çalıştırmak için daha verimli bir yolu var mı?

0 Cevap php

Ben bir özel alışveriş sepeti bileşeni yazdık Joomla web sitesi var. Kullanıcı temelde bizim veritabanında saklıyorsanız kodları satın alıyor - bu basılı bir teşvik kartı ile ilişkilidir. Kullanıcı denetler, ben kodları listesinde döngü sonra, (onlar satın aldığınız ancak birçok) veritabanından kodlarının bir yığın kapmak ve benim arabası bilgileri diğer tabloları güncellemek gerekir. Sepeti böyle bir oturum değişkeni diziler bir dizi olarak saklanır:

$cart = Array ( 
[0] => Array ( [TypeFlag] => S [qty] => 25 [denom] => 50  [totalPrice] =>  100 )
[1] => Array ( [TypeFlag] => V [qty] => 10 [denom] => 25  [totalPrice] => 25 ) 
[2] => Array ( [TypeFlag] => C [qty] => 100 [denom] => 25  [totalPrice] => 25 ) 
) 

Her iç dizi sepetinde bir satır öğesi olduğu. Bu soruna neden Adet Adet bulunuyor; Onlar düşük olduğunda döngü içindeki tüm ekleme ve güncelleştirme sorguları çalışan hiçbir sorun yok. Adet Adet elemanları yüksek olduğunda Ancak, ben bellek ayırma hataları başlar. Temelde kez birkaç sorguları yüzlerce koşma gibi bu, anlaşılabilir bir durumdur. Sorun bir kullanıcı potansiyel (bu kurumsal bir teşvik programı) bir seferde bin kartları veya daha fazla sipariş olduğunu, bu yüzden tüm kayıtları bakılmaksızın adet olup, ne kadar büyük, eklenen ve güncellenen almak gerekiyor.

İşte ilgili kodu bulunuyor:

İlk olarak, loop:

//loop through vouchers to create purchase records, update voucher records, create certificates
$rightNow = date("YmdHis");
foreach($vouchers as $voucher) {
    $VoucherID = $voucher['VoucherID'];
    $VoucherIDList .= $VoucherIDList ."," . $voucher['VoucherNbr'];
    //create purchase record            
    $purchData = array("CcAuthCode"=>$ccAuthCode,"VoucherID"=>$VoucherID,"PurchAmt"=>$realFinalTotal, "ShipHandFee"=>number_format($shippingCharge,2),  "PurchDT"=>$rightNow,  "AcctID"=>$accountIDs['UserAcctID'], "ShipAddrID"=>$accountIDs['MailingAcctID']);
    $purchID = $model->createPurchaseRecord($purchData);    

    //update voucher
    $model->updateVoucherInfo($VoucherID,$accountIDs['BillingAcctID'], $denom, $purchID,$message);
}

Gerçek sorgular modelinde createPurchaseRecord ve updateVoucherInfo fonksiyonları içerde:

function createPurchaseRecord($data){    
    $db =& JFactory::getDBO();
    $insFields = "";
    $valFields = "";

    foreach ($data as $f => $v){
        $insFields .= "," . $f;
        $valFields .= "," . $db->quote($v);
    }

    $insFields = substr($insFields,1);
    $valFields = substr($valFields,1);

    $query = "insert into arrc_PurchaseActivity ({$insFields}) values ({$valFields})";
    $db->setQuery($query);
    if (!$db->query()) error_log($db->stderr());

    return $db->insertid();
}

function updateVoucherInfo($voucherID,$billingAcctId, $balanceInit, $purchID, $certMessage) {
    //set ActivatedDT, BalanceInit
    $rightNow = date("YmdHis");
    $db =& JFactory::getDBO();
    $query = "UPDATE arrc_Voucher 
        set ActivatedDT=".$db->quote($rightNow).", BalanceInit=".$db->quote($balanceInit) . ", BalanceCurrent=".$db->quote($balanceInit).
    ", AcctID=".$db->quote($billingAcctId).", PurchActvtyID=".$db->quote($purchID) . ", certMessage=".$db->quote($certMessage)
    . " WHERE VoucherID=".$db->quote($voucherID);

    $db->setQuery($query);
    if (!$db->query()) error_log($db->stderr()); 
    $certificateNumber = $voucherID;
    return $certificateNumber;

}

Herkes bana yardımcı olabilir misiniz? Bu daha verimli hale getirmek için bir yol olmalı; Ben bir zamanda herhangi bir fazla 30 ya da bunu yapmak için çalıştığınızda şu anda bir bellek hatası atıyor; 1.000 + için verilen gereksinimi, bu büyük bir anlaşma olduğunu. Bu hatadır:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 71303153 bytes) in /var/www/html/mysite.com/components/com_arrcard/controllers/checkout.php on line 110

Hat 110 Yukarıdaki döngü bu satırı:

   $VoucherIDList .= $VoucherIDList ."," . $voucher['VoucherNbr'];

0 Cevap