我正在使用将运行最少2000个循环的foreach循环
foreach ($giftCardSchemeData as $keypreload => $preload) {
for ($i=0; $i <$preload['quantity'] ; $i++) {
$cardid = new CarddetailsId($uuidGenerator->generate());
$cardnumber = self::getCardNumber();
$cardexistencetype = ($key == "giftCardSchemeData") ? "Physical" : "E-Card" ;
$giftCardSchemeDataDb = array('preload' => array('value' => $preload['value'], 'expirymonths' => $preload['expiryMonths']));
$otherdata = array('cardnumber' => $cardnumber, 'cardexistencetype' => $cardexistencetype, 'isgiftcard' => true , 'giftcardamount' => $preload['value'],'giftCardSchemeData' => json_encode($giftCardSchemeDataDb), 'expirymonths' => $preload['expiryMonths'], 'isloyaltycard' => false, 'loyaltypoints' => null,'loyaltyCardSchemeData' => null, 'loyaltyRedeemAmount' => null, 'pinnumber' => mt_rand(100000,999999));
$output = array_merge($data, $otherdata);
// var_dump($output);
$carddetailsRepository = $this->get('oloy.carddetails.repository');
$carddetails = $carddetailsRepository->findByCardnumber($cardnumber);
if (!$carddetails) {
$commandBus->dispatch(
new CreateCarddetails($cardid, $output)
);
} else {
self::generateCardFunctionForErrorException($cardid, $output, $commandBus);
}
}
}
像上面的foreach一样,我总共有5个。每当5 foreach运行时我调用该函数,然后返回响应。这需要更多的时间并且php最大执行时间发生。 是否有任何方式发送响应,然后我们可以在服务器端运行foreach而不是创建最大执行时间问题。还需要对foreach进行优化。
另外在symfony中我尝试了try catch方法,在上面的代码中存在检查它返回Entity closed Error。我已经在Db中使用了存在性检查,但需要进行优化
答案 0 :(得分:0)
使用此代码似乎有很多错误(或要进行优化),但请关注您的问题:
首先,我认为此代码不应出现在由访问者触发的代码中。 你应该分开2个过程: 1.运行的cronjob将生成必须生成并保存的所有信息,以生成信息到数据库。 cronjob可以花费所需的时间。看看Symfony's console components 2.通过从数据库中提取生成的信息并将其传递给Twig模板来仅显示生成的信息的页面。
然而,看看你发布的代码,我认为它可以大大优化。你似乎有一个foreach循环来获取可变数据,并且你有一个for循环似乎根本不会产生很大的可变性。 因此,for循环中的大多数代码现在都在反复执行而不进行任何实际更改。
这是一个可以提供更高性能的概念。当然,因为我不知道你的代码的实际情况,你将不得不修复它#34;。
$carddetailsRepository = $this->get('oloy.carddetails.repository');
$cardexistencetype = ($key == "giftCardSchemeData") ? "Physical" : "E-Card";
foreach ($giftCardSchemeData as $keypreload => $preload) {
$cardnumber = self::getCardNumber();
$carddetails = $carddetailsRepository->findByCardnumber($cardnumber);
$giftCardSchemeDataDb = array('preload' => array('value' =>
$preload['value'], 'expirymonths' => $preload['expiryMonths']));
$otherdata = array('cardnumber' => $cardnumber, 'cardexistencetype' =>
$cardexistencetype, 'isgiftcard' => true , 'giftcardamount' =>
$preload['value'],'giftCardSchemeData' =>
json_encode($giftCardSchemeDataDb), 'expirymonths' =>
$preload['expiryMonths'], 'isloyaltycard' => false, 'loyaltypoints' =>
null,'loyaltyCardSchemeData' => null, 'loyaltyRedeemAmount' => null,
'pinnumber' => 0);
$output = array_merge($data, $otherdata);
for ($i=0; $i <$preload['quantity'] ; $i++) {
$cardid = new CarddetailsId($uuidGenerator->generate());
$output['pinnumber'] = mt_rand(100000,999999);
if (!$carddetails) {
$commandBus->dispatch(
new CreateCarddetails($cardid, $output)
);
} else {
self::generateCardFunctionForErrorException($cardid, $output, $commandBus);
}
}
}
另外:如果在此代码中您触发任何数据库插入或更新,则不希望每次迭代都触发它们。您将需要启动某种数据库事务并在每次X迭代时刷新查询。