我有一个 Joomla 网站,我已经为其编写了一个自定义购物车组件。用户基本上是在购买我们存储在数据库中的代码——这些代码与打印的激励卡相关联。当用户结帐时,我需要从数据库中获取一大块代码(无论他们购买了多少),然后遍历代码列表并使用我的购物车中的信息更新其他表。购物车作为数组数组存储在会话变量中,如下所示:
$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 )
)
其中每个内部数组是购物车中的一个行项目。这是导致问题的数量;当它们很低时,在循环内运行所有插入和更新查询没有问题。但是,当 qty 元素很高时,我开始出现内存分配错误。这是可以理解的,因为它基本上运行了数百次查询。问题是,用户可能一次订购一千张或更多张卡片(这是一个公司激励计划),所以我需要能够插入和更新所有记录,无论数量有多大。
以下是相关代码:
首先,循环:
//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);
}
实际查询位于模型中的 createPurchaseRecord 和 updateVoucherInfo 函数中:
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;
}
谁能帮我吗?必须有一种方法可以提高效率;现在,当我尝试一次做超过 30 个左右时,它会引发内存错误;考虑到 1,000+ 的要求,这很重要。这是错误:
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
第 110 行是上述循环中的这一行:
$VoucherIDList .= $VoucherIDList ."," . $voucher['VoucherNbr'];