2017-03-22 86 views
0

我的服务器连接看起来像不稳定的原因,有时会成功发送电子邮件,有时会失败。重新发送电子邮件与try catch导致内存超出限制?

错误说

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('[email protected]'); 
    } else { 
     $message->setFrom(Yii::$app->user->identity->email); 
    } 
    $message->setTo(Yii::$app->params['adminEmail']) 
    ->setFrom(Yii::$app->params['adminEmail']) 
    ->setTo("[email protected]") 
    ->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) 

请告诉我,我做错了什么吗?

在此先感谢。

+0

您在PHP方面的内存不足。检查php配置中的memory_limit并将其设置得更高一些。问题是,你的服务器为什么要消耗这么多的内存? – R13e

+0

@ R13e,因为用我上面的代码重新发送电子邮件,对吗? –

+0

可能的,但我不认为这是原因。如果我理解正确,重新发送过程只会尝试分配20480字节。那根本不算什么。 – R13e

回答

0

是不是很明显?您正在捕获SSL超时异常,但是您立即再次运行相同的函数,并抛出相同的异常,直到内存耗尽为止。

你确实增加了$tried,但是你不检查它的值。我认为你应该尝试发送邮件5次,如果仍然存在的话。一些工作必须非常糟糕,需要技术上的关注,在这种情况下,应该捕获SwiftTransport异常并向最终用户抛出另一个异常。