2015-06-23 81 views
0

我在yii中有一个如下所示的代码。如何在递归函数中返回值后停止代码的执行?

<?php 
class MediaController extends Controller { 
    public $mail_try = 1; 

    public function actionUpdate() 
    { 
     // ........... Other Code 
     $return_err = array(); 
     /* Now Send Email */ 
     if(sizeof($mail_queue)>0) 
     { 
      foreach($mail_queue as $resmail) 
      { 
       $this->mail_try = 1; 
       $to_arr = $resmail['to_arr']; 
       $cc_arr = $resmail['cc_arr']; 
       $from = $resmail['from']; 
       $subject = $resmail['subject']; 
       $message = $resmail['message']; 
       $log_msg = $resmail['log_msg']; 
       $attachment = $resmail['attachment']; 
       $log = $resmail['log']; 
       $output = $this->mailsend($to_arr, $cc_arr, $from, $subject, $message, 'Image/Media update (action : insert) ', $attachment,$log); 
       if($output==0) 
       { 
        $return_err[] = $resmail['vendor_name']; 
       } 
      } 
     } 
    } 


    public function mailsend($to, $cc, $from, $subject, $message, $crontask, $attachment = array(),$log='') { 
     //....... Other Code 
     //....... Other Code 
     try{ 
      if (!$mail->Send()) { 
       if($this->mail_try < 3) 
       { 
        $this->mail_try++; 
        $this->mailsend($to, $cc, $from, $subject, $message, $crontask,$attachment,$log); 
        return 0; 
       } 
      } else { 
       return 1; 
      } 
     } catch (Exception $ex) { 
      return 0; 
     } 
    } 
} 
?> 

我想要做的是如果邮件发送失败,然后调用相同的函数重试发送电子邮件。如果电子邮件发送仍然失败,则返回0 else 1.然后使用此返回值,我试图通知用户有关邮件发送错误。

此前,我认为低于返回值的代码将不会执行。但我错了。在上面的情况下,它在返回值之后执行,因为它在递归函数中。

那么,如何解决这个问题?

+0

说实话,我不能工作了,你说什么你的问题。快速查看代码虽然让我感觉'$ this-> mailsend(...)'行应该是'return $ this-> mailsend(...)',删除以下'return 0;'。最后,它的外观有一条路径,当邮件两次失败时它将返回null。 –

+0

这里的问题是,即使在返回值之后代码仍在执行,所以我无法获得预期的返回值。我试图做的是在发送电子邮件的几次尝试之后返回1或0的值。 – DS9

+0

因此,如果我按照你的建议编辑我的代码,它仍然会在返回值后执行代码。 – DS9

回答

1

所以有两个问题,我看到提供的代码。

1)无论重发是否通过或失败,则该方法返回0

2)如果函数失败了两次,该方法将返回0或1 null替代,因为没有回退把它捡起来(即当$this->mail_try是3时)。

修改了以下更新的代码,以便无论返回值来自递归调用,它都会直接返回而不是仅返回0.另一个更改是,如果两次都失败,它将返回0而不是null

public function mailsend($to, $cc, $from, $subject, $message, $crontask, $attachment = array(),$log='') { 
    //....... Other Code 
    //....... Other Code 
    try{ 
     if (!$mail->Send()) { 
      if($this->mail_try < 3) 
      { 
       $this->mail_try++; 
       return $this->mailsend($to, $cc, $from, $subject, $message, $crontask,$attachment,$log); 
      } 
      return 0; 
     } else { 
      return 1; 
     } 
    } catch (Exception $ex) { 
     return 0; 
    } 
} 
+0

如果mailsend一开始就失败,那么输出是什么,然后在二次测试中通过,那么返回值是多少?并且返回值之后的代码被执行或停止? – DS9

+0

当它返回一个'return'语句并返回到原始调用者(可能是之前运行的'mailsend')时,当前方法结束。如果第一个'mailsend()'失败,第二个成功,它应该返回'1'。 –

+0

需要注意的另一件事是,如果发生异常,除了已经发生的事情之外,它不会再尝试,所以如果在'mailsend'的原始调用中抛出异常,它将不会再尝试。不知道这是否是有意的,这是对你的决定。 –

0

什么是mail->Send()方法? 如果它发送电子邮件,这可能是一个答案。

public function mailsend($to, $cc, $from, $subject, $message, $crontask, $attachment = array(),$log='') { 
//....... Other Code 
//....... Other Code 
try{ 
    $this->mail_try = 1; 
    while(!mail->Send() && $this->mail_try<=3){ 
     $this->mail_try++; 
    } 
    if($this->mail_try == 4){return 0;}//failed 
    else {return 1;} //it means mail has been send before $this->mail_try = 3 
} catch (Exception $ex) { 
    return 0; 
} 
} 

其尚未测试,请尝试