2012-07-02 4 views
1

MVC 프레임 워크와 컨트롤러를 사용하여 소멸자에서 페이지를 렌더링합니다. PHP를 통해 파일을 다운로드 중이므로 작업이 끝나면 스크립트가 종료됩니다.소멸자를 호출하지 않고 PHP 스크립트를 종료하는 방법은 무엇입니까?

소멸자를 호출하지 않고 스크립트를 종료하는 방법은 무엇입니까?

더 좋은 솔루션이 있습니까?

소멸자를 종료하고 호출하십시오.

+0

어떤 MVC 프레임 워크를? –

+0

그것은 커스텀 프레임 워크입니다. –

+1

페이지가 소멸자 메서드에서 렌더링되는 것이 이상하다는 것을 알았습니다. 왜 프레임 워크에 의해 호출되는 렌더링 메소드에 없습니까? 내가 놓친 게 있니? –

답변

2

David가 말했듯이 : 소멸자 내에서 exit()를 호출하여 중지해야합니다.

그러나이 소멸자로 인해 발생하는 시각적 출력을 중단하고 다른 부작용 (파일 닫기, 데이터베이스 연결 닫기)을 중단하고 싶다면 추가 출력을 죽이는 것이 가장 좋지만 소멸자를 남겨 두는 것이 가장 좋습니다 혼자. 제 생각에는 소멸자가 한가지 중요한 이유, 즉 청소를하는 경향이 있기 때문에 취할 경로입니다.

당신은 버퍼링 된 출력을 조작하여 수행 할 수 있습니다

<?php 
class Tester{ 
    public function devNull($string){ 
     return ""; 
    } 

    public function runAndBreak(){ 
     print "run" . PHP_EOL; 

     // if any output buffer is working, flush it and close it 
     if(ob_get_level()) ob_end_flush(); 

     // redirect new buffer to our devNull 
     ob_start(array($this,'devNull')); 
     exit(); 
     print "still running"; 

    } 

    function __destruct(){ 
     print "destructor" . PHP_EOL; 
    } 

} 

$t = new Tester(); 
$t->runAndBreak(); 

이것은 단지 run를 인쇄하지 소멸자에 무엇이합니다. ob_start에 자신의 콜백 루틴을 제공하여 처리 한 다음 출력을 반환합니다. 여기서 우리는 빈 문자열을 반환함으로써 단순히 그것을 버립니다.

3

this answer을 참조하십시오. 파일이 실제로 브라우저로 전송되었는지 확인하는 파일을 다운로드하는 클래스에서 소멸자를 작성해보십시오. 그렇다면 해당 소멸자에서 exit()를 호출하십시오.

+0

소멸자 호출 순서를 고려 했습니까? $ obj1과 $ obj2를 생성하면 소멸자는 dest2와 dest1로 호출됩니까? 또는 객체가 범위를 벗어날 때 주문이 결정됩니까? –

0

이것은 확실히 스크립트를 중지하지만, 하나 개의 프로세스가 여러 PHP 그뿐만 아니라 중지 요청 역할을 어디 이러한 서버를 실행하는 경우주의해야합니다

$pid = getmypid(); 
exec("kill $pid"); 
exec("TSKILL $pid"); 
관련 문제