2014-03-28 4 views
6

kl'Zend Frameworks flashMessenger과 관련된 이상한 문제가 발생하여 문제의 원인이나 해결 방법을 찾을 수 없습니다.긴 요청 후 Message를 추가 할 때 flashMessenger가 작동하지 않습니다

요청한 작업이 매우 오래 걸리는 경우 flashMessenger가 예상대로 작동하지 않습니다.

비 작동 예 : 위의 코드와

class AttachmentController extends Zend_Controller_Action { 

    public function printAction() { 
     // action takes really long and causes flash message to not appear at all 
     sleep(11); 

     $this->_helper->flashMessenger 
      ->setNamespace('success') 
      ->addMessage("It's done!"); 

     $this->_redirect('/attachment/index'); 
    } 
} 

/attachment/index 뒤에 컨트롤러 액션은 flashMessage를 표시하지 않습니다. 내가 스크립트의 실행 시간을 줄일 경우

그러나 , 그것은 작동합니다

class AttachmentController extends Zend_Controller_Action { 

    public function printAction() { 
     // now the action runs faster and the flashMessage appears! 
     sleep(1); 

     $this->_helper->flashMessenger 
      ->setNamespace('success') 
      ->addMessage("It's done!"); 

     $this->_redirect('/attachment/index'); 
    } 
} 

질문 : 는 무엇 flashMessenger 내 메시지를 표시하지 않도록에 대한 원인이 될 수있다? 어떻게 해결할 수 있을까요?

참고 :

  • 예, 나는이 문제입니다 확신합니다. 프로덕션 코드에 sleep(11)을 삽입하고 설명 된 동작을 생성합니다. 문제는 이 아니며은 대소 문자 분리를 위해 교체 한 코드로 인해 발생합니다. 스크립트의 오랜 실행 시간 때문입니다.
  • 스크립트를 더 빨리 실행할 수 없습니다. 예제의 sleep(11) 대신 프로덕션 코드에서 프린터로 보내지는데 약 11 초가 걸립니다.
+0

감사합니다. – Kaii

+0

'flashMessenger'에 무엇이 있습니까? 'addMessage'는 무엇을합니까? db 또는 세션에 쓰기? ''FlashMessenger'에서'addMessage()'를 찾을 수 없습니다 (https://github.com/zendframework/zf2/blob/bbb0545ad6552b9ecadd96c12223022b38734686/library/Zend). /View/Helper/FlashMessenger.php) – Rudie

+0

ZF2 API 참조 및 ZF2 태그에 대해 혼란스러워합니다. 귀하의 코드는 ZF1처럼 보입니다! – Mamuz

답변

-1

저는 PHP에서 js로 재생해야한다고 생각합니다.

sleep() 주어진 시간 (초) 동안 실행을 중지하십시오.

sleep(1) 또는 sleep(11)을 사용할 때 둘 다 동일한 출력을 제공합니다.

나는 아래에 주어진 코드로 파일을 보내고 있다고 생각합니다.

$this->_redirect('/attachment/index'); 

당신은 (지금 숨기기 메시지가 11 초 후에 표시) 실행되는 다른 메시지에서 사용되지 않는 당신이 JS를 작성해야하는 (11 초 후로드를 식별하기 위해) 특별한 메시지를 보내야 후 해당 메시지가 메시지의 in.phtml 파일로 수신 될 때마다 11 초.

3

두 예제 모두 정상적으로 작동합니다. sleep(11)가 작동하지 않으면 부작용이있을 수 있습니다. 동시성으로 인해 발생할 수 있습니다. FlashMessenger는 세션 기반이므로 세션 구성을 확인해야합니다. 리디렉터 액션 도우미 $this->_redirect();은 헤더를 보내고 새로운 전체 디스패치 프로세스를 생성하는 새 HTTP 요청을 만듭니다. 따라서이 프로세스에 등록 된 플러그인도 확인해야합니다 (here 설명).

이 문제를 해결하려면 리디렉터 대신 전달자를 사용해보십시오. 좋은 점은 here (redirect-between-redirect-and-forward)과 here (use-flashmessenger-without-redirect)입니다.

덧붙여 말하자면, sleep을 사용하여 "printjob done"을 모의하는 것은 나쁜 습관입니다. "대기열에 인쇄물 추가"와 같은 다른 메시지를 선호해야합니다. 이는 거짓말이 아니며 사용자에게 친숙합니다.

+0

좋은 제안, 리디렉션 대신 전달하면 flashMessenger에 차이가 생기는 경우 시도해 보겠습니다. 큐잉 제안에 대해서는 재미 있습니다. 왜냐하면 "대기열에 추가"를 실제 인쇄 논리로 바꾸어야했기 때문입니다. 'sleep (1)'은 작업을 대기열에 넣기위한 모형 (거의 즉시 반환)이며'sleep (11)'은 실제 인쇄 논리의 모형입니다. printjob이 완료되면 리턴되며, 시간이 걸립니다. 인쇄가 성공했는지 여부에 관계없이 flashMessenger()가 표시되어야합니다. (즉, 프린터에 연결하는 동안 소켓 타임 아웃) – Kaii

+0

리디렉션 대신 전달하면 메시지가 나타납니다. 우리는 이제 해결 방법으로 응용 프로그램에서 전달할 수 있습니다. 나는 여전히 해결하고자하는 리다이렉트 문제의 원인을 찾고있다. (전달은 리디렉션과 같지 않습니다. 전달할 수없는 올바른 URL을 사용자가보고 싶습니다.) 나는 진짜 문제를 보여주는 대답에 현상금을 수여 할 것이다. – Kaii