작은숲:위키노트/PHP flush: 두 판 사이의 차이
잔글 (문자열 찾아 바꾸기 - "<source" 문자열을 "<syntaxhighlight" 문자열로) |
잔글 (문자열 찾아 바꾸기 - "</source>" 문자열을 "</syntaxhighlight>" 문자열로) |
||
| 15번째 줄: | 15번째 줄: | ||
flush(); | flush(); | ||
sleep(1); | sleep(1); | ||
}</ | }</syntaxhighlight> | ||
위에 두 줄은 gzip 압축 전송하는 것을 막는 것이다. 압축 전송하면 모든 출력값을 모아서 gzip 압축한 후에 보내기 때문에 출력값을 필요할 때마다 보내려면 gzip 압축을 포기해야 한다. 그런 후 브라우저에 따라 일정 크기 이상이 되지 않으면 처리하지 않는 문제를 피하기 위해 사전에 빈 문자열을 4,000 바이트 이상 보내준다. 그런 후 필요한 출력을 하고 <tt>flush()</tt> 함수를 써서 출력한 값을 곧바로 전송한다. | 위에 두 줄은 gzip 압축 전송하는 것을 막는 것이다. 압축 전송하면 모든 출력값을 모아서 gzip 압축한 후에 보내기 때문에 출력값을 필요할 때마다 보내려면 gzip 압축을 포기해야 한다. 그런 후 브라우저에 따라 일정 크기 이상이 되지 않으면 처리하지 않는 문제를 피하기 위해 사전에 빈 문자열을 4,000 바이트 이상 보내준다. 그런 후 필요한 출력을 하고 <tt>flush()</tt> 함수를 써서 출력한 값을 곧바로 전송한다. | ||
== 참고 == | == 참고 == | ||
2021년 3월 28일 (일) 12:54 판
PHP flush() 함수는 출력 버퍼에 쌓여있는 내용을 곧바로 전송하는 역할을 한다. 아파치에서 PHP를 동적 모듈(DSO, 동적 공유 객체)로 올려 사용할 때는 아래와 같이 하면 스크립트가 종료하기 전이라도 보내고자 하는 출력값을 보낼 수 있다.
@apache_setenv('no-gzip', 1);
@ini_set('zlib.output_compression', 0);
@ini_set('implicit_flush', 1);
set_time_limit(0);
for ($i = 0; $i < ob_get_level(); $i++) ob_end_flush();
ob_implicit_flush(true);
if (ob_get_level() == 0) ob_start();
echo str_repeat(' ', 4096), PHP_EOL;
for ($i = 0; $i < 10; $i++) {
echo "TEST!\n";
ob_flush();
flush();
sleep(1);
}
위에 두 줄은 gzip 압축 전송하는 것을 막는 것이다. 압축 전송하면 모든 출력값을 모아서 gzip 압축한 후에 보내기 때문에 출력값을 필요할 때마다 보내려면 gzip 압축을 포기해야 한다. 그런 후 브라우저에 따라 일정 크기 이상이 되지 않으면 처리하지 않는 문제를 피하기 위해 사전에 빈 문자열을 4,000 바이트 이상 보내준다. 그런 후 필요한 출력을 하고 flush() 함수를 써서 출력한 값을 곧바로 전송한다.
참고
- (영어) How to use AJAX to show progress of a PHP script without polling
- (영어) StackOverflow: Flush problem with ajax
| PHP 7.0 | |
|---|---|
| PHP 5.6 | |
| PHP 5.5 | |
| 확장 기능 | |
| 활용 | |
| 소프트웨어 | |