使用try catch重新发送电子邮件导致超出内存限制?

时间:2017-03-22 07:22:21

标签: yii2

我的服务器连接看起来不稳定,因为它有时会成功发送电子邮件,有时会失败。

错误说

Swift_TransportException

Connection to ssl://in-v3.mailjet.com:465 Timed Out

在上述情况下,如果发现异常,我会尝试更改代码以重新发送电子邮件。

这是我在控制器中的代码。

//this line after import class
ini_set('memory_limit', '256M');

public function resend_on_error($tried)
{
  try{
    $message = Yii::$app->mail->compose();
    if (Yii::$app->user->isGuest) {
      $message->setFrom('from@domain.com');
    } else {
      $message->setFrom(Yii::$app->user->identity->email);
    }
    $message->setTo(Yii::$app->params['adminEmail'])
    ->setFrom(Yii::$app->params['adminEmail'])
    ->setTo("mymail@gmail.com")
    ->setSubject('Reset Password '.$tried)
    ->setHtmlBody($this->renderAjax('//email/_konten',['content'=>'goes here']))
    ->send();
     return 1;

  }catch(\Swift_TransportException $e){
    $this->resend_on_error($tried++);
  }
}

public function actionEmail()
{
  $tried = 1;
  if($this->resend_on_error($tried) == 1){
      return "send success";
  }
}

但我得到了这个

Allowed memory size of 268435456 bytes exhausted (tried to allocate 4096 bytes)

请告诉我我在这里做错了什么?

提前致谢。

1 个答案:

答案 0 :(得分:0)

不是很明显吗?您正在捕获SSL超时异常,但是您会立即再次运行相同的函数并抛出相同的异常,此循环将在内存不足时发生。

你增加了$tried,但你没有检查它的值。我认为你应该尝试发送邮件5次,如果它仍然是。工作必须严重破坏并需要技术注意,在这种情况下,捕获SwiftTransport异常并向最终用户抛出另一个。