2017-10-10 115 views
2

我有foreach循环就像上面的foreach我有他们的全部5将运行最低2000环代码需要遍历最小的2000次在PHP的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); 
     } 
    } 
} 

。当我每次运行5个foreach时调用函数,然后返回响应。它需要更多的时间,php的最大执行时间发生。 是否有任何方式发送响应,然后我们可以在服务器端运行foreach,而不是创建最大执行时间问题。还需要为foreach进行优化。


而且在symfony中我已经尝试了存在检查尝试捕捉方法在上面的代码返回实体关闭错误。我已经teprorily用dB为单位的生存确认,但需要优化

+0

这是什么情况?这是你一次或很少产生新卡片的事情,还是你为每个访问者所做的事情? – bjelleklang

+0

你试过ini_set('max_execution_time',0);参数或者set_time_limit(0); – AZinkey

回答

0

似乎有很多错误的(或优化),此代码,但让我们专注于您的问题:

首先我觉得这个代码不应该在访问者触发的代码中。 您应该分开2个进程: 1.运行cronjob将生成必须生成的所有内容,并将生成的信息保存到数据库。 cronjob可以花费尽可能多的时间。查看Symfony's console components 2.通过从数据库中提取并将其传递给Twig模板,仅显示生成的信息的页面。

然而,看着你发布的代码,我认为它可以被大大地优化。您似乎有一个获取可变数据的foreach循环,并且您有一个for循环,似乎根本不会产生太多可变性。 因此,for循环中的大部分代码现在正在反复执行,而未做任何实际更改。

这是一个可以提供更高性能的概念。当然,因为我不知道你的代码的实际情况,你将不得不“修复它”。

$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次迭代刷新查询。

+0

感谢您的优化。而不是cron作业symfony事件派发和侦听器可以花费尽可能多的时间来执行循环吗? – Tharunkumar

+0

我不确定我是否理解这个问题。如果您在循环内部派发一个事件,那么执行代码的侦听器仍然会像现在一样花费尽可能多的时间。 – vrijdenker

+0

我问的是当通过路由调用控制器文件函数时,我们调度上述循环并返回成功响应。在这里,事件功能将运行或不在后台。用户可以查看其他页面,当他们返回到该页面时,如果循环完成,我们可以显示响应 – Tharunkumar