代码需要在php foreach中循环至少2000次

时间:2017-10-10 05:41:48

标签: php symfony foreach

我正在使用将运行最少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中使用了存在性检查,但需要进行优化

1 个答案:

答案 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迭代时刷新查询。