2015-06-23 2 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, как нет запасного варианта, чтобы забрать его (т.е. когда $this->mail_try равно 3).

Следующий обновленный код изменен таким образом, чтобы независимо от возвращаемого значения от рекурсивного вызова он возвращался обратно напрямую, а не возвращался только 0. Другое изменение заключается в том, что если он не срабатывает оба раза, он вернет 0 вместо нуля

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; 
} 
} 

его еще не испытано, пожалуйста, попробуйте

Смежные вопросы