2009-11-08 2 views
0

PHP가 모든 페이지 출력이 완료되었음을 브라우저에 알리는 방법을 찾으려고합니다. 페이지가 완료된 후에는 대개 오래 걸리지 않는 통계 코드가 실행되지만 사용자 브라우저가 더 많은 데이터를 기다리고 싶지 않은 경우 통계 코드가 실행됩니다. 이것은 휴대 전화와 함께 작동해야하기 때문에 JavaScript를 통해 수행 할 수 없습니다.PHP 출력 완료 알림

이미 나는 나의 위치 MB 텍스트 (일본어)에 문제가없는 보장하기 위해

mb_http_output("UTF8"); 
ob_start("mb_output_handler"); 

를 사용하여 출력 버퍼링을 시작 해요. 나는 ob_end_flush()가 트릭을 할 것이라고 기대했지만, 만약 내가 잠을 자면 (10); ob_end_flush() 후 브라우저는 추가로 10 초 동안 대기합니다. 누구든지 이것에 대해 어떤 생각을 가지고 있습니까?

UPDATE : 사용 불안감 내가 "ob_gzhandler를은"이 gzip으로 하나 여기에 모든 가능한 문제를 참조 작업을 진행 아래 접근? 다시

//may be also add headers for cache-control and expires (IE) 
header("Connection: close"); //tells browser that connection will be closed 
ob_start(); 
ob_start("ob_gzhandler"); 
//page content 
ob_end_flush(); 
$size = ob_get_length(); 
header("Content-Length: $size"); 
ob_end_flush(); 
flush(); 

UPDATE :

는 위의 코드에서 다른 봐 주시기 바랍니다. ob_start()를 수행해야합니다. ob_start ("ob_gzhandler") 전에; 그런 다음 ob_end_flush()를 호출하십시오. ob_get_length()를 호출하기 전에 올바른 gzip 압축 크기를 얻으십시오. 이 라인

//may be also add headers for cache-control and expires (IE) 
header("Connection: close"); //tells browser that connection will be closed 
ob_start(); 
//generate your output 
$size = ob_get_length(); 
header("Content-Length: $size"); 
ob_end_flush(); 
flush(); 
//continue statistic processing 

답변

0

사용 뭔가. 첫 번째 스크립트의 출력을 모니터링하고 iframe을 사용하는 다른 스크립트를 사용하는 경우 아마 그렇게 할 수 있습니다.

페이지가로드 된 것으로 간주 될 때 출력이 완료되면 브라우저는 알고 있습니다. 그것이 바로 브라우저가 알고있는 것입니다.

+0

나는 이것을 시도하고 내가 sleep (20)과 같은 것을 추가하면; flush() 후에; 브라우저 (FireFox 3.5)에는 로딩 표시기가 20 초 동안 계속 표시됩니다. – AWinter

+0

필자는 마침내이 기능을 사용할 수있게되었지만 헤더 ("Content-Encoding : none")를 포함해야만 가능합니다. 머리글 바로 아래 ("Connection : close"); 이것이 왜 일어 났는지에 대한 생각은? – AWinter

+0

설정 머리글 ("Content-Encoding : none")을 사용하여이 작업을 수행하는 방법에 대한 아이디어. 가능한 경우 gzip을 계속 실행하십시오. – AWinter

0

I 출력 출력을 보내는 스크립트에서 적어도 완료 브라우저를 알릴 수있는 방법이라고 생각하지 않습니다 함께

0

백그라운드에서 새 PHP 프로세스를 포크하여 통계를 처리하도록 할 수 있습니다. 같은 뭔가 : 마지막에 shell_exec('php stats.php &');

&, 방문자가 그것을 통지하지 않습니다는 stats.php 20 초 정도 걸립니다 그래서 경우에도, 백그라운드에서 실행 있어요 있는지 확인합니다.

shell_exec('php stats.php -b '. escapeshellarg($_SERVER['HTTP_USER_AGENT']) .' &');

stats.php에서, 그 데이터를 얻을 수있는 $argv 변수를 사용하십시오 : 당신은 아마이 같은 매개 변수를 전달하여 할 수있는 통계 스크립트에 데이터를 전달해야합니다 .

통계 코드가 오랫동안 실행되지 않는다면 이렇게하지 않을 것입니다. 모든 페이지로드에 대해 새 프로세스를 포크하는 데 약간의 오버 헤드가 있기 때문입니다. 통계 코드를 처리하는 데 시간이 오래 걸리는 이유는 무엇인지 모르겠지만 다른 솔루션은 원시 데이터를 데이터베이스에 삽입하고 백그라운드 작업을 통해 해당 데이터를 사용하여 유용한 통계를 작성하는 것입니다. cron 작업이나 대기열을 처리하는 infinte 루프에서 화면을 실행하는 방법으로 수행 할 수 있습니다.

+0

PHP에서 새 프로세스를 백그라운드에서 실행하려면 stdout을 리디렉션해야합니다. 'shell_exec ('php stats.php>/dev/null &');' –

+0

사실, 잊어 버렸습니다. stderr을 stdout으로 보내고 stdout을/dev/null로 지정하는 것이 좋습니다. –

0

통계 코드를 별도의 함수로 옮기고 dom에서 ajax 호출을 사용하여이 함수를 호출하십시오.이 메타 코드처럼 렌더링 된 페이지에 자바 스크립트 코드의 준비 또는 온로드 이벤트 :

<html> 
    <script type="text/javascript"> 
    dom.onready = Ajax.call(location.href + '?do_stats'); 
    </script> 
    <body>... 
</html> 

dom.ready 이벤트가 jQuery를 또는 프로토 타입 라이브러리에 의해 제공 될 수있다. 단점은 js가 활성화 된 경우에만 작동한다는 것입니다.

다른 방법으로 통계에 필요한 모든 정보를 데이터베이스에 기록하고 거기에서 대기중인 데이터를 수집하고 백그라운드에서 작업하는 스크립트를 디스패치 할 수 있습니다 (예 : cron을 사용).

+0

불행히도 대부분의 일본 휴대폰은 자바 스크립트를 지원하지 않으며 일본에서는 특히 전체 사용자의 50 % 이상을 차지할 수 있습니다. – AWinter

+0

그래, 중요한 점은 질문에서 누락되었습니다. 수정해야합니다. – hurikhan77

+0

죄송합니다. 죄송합니다. – AWinter