mod_fcgid 사용자를위한 참고 사항 (사용자의 책임하에 사용하십시오).
빠른 솔루션
Joeri Sebrechts의 대답 은 실제로 기능적입니다. 그러나 mod_fcgid 를 사용 하는 경우이 솔루션이 자체적으로 작동하지 않을 수 있습니다. 즉, flush 함수가 호출 될 때 클라이언트와의 연결이 닫히지 않습니다.
mod_fcgid 의 FcgidOutputBufferSize
구성 매개 변수가 원인 일 수 있습니다. 이 팁은 다음에서 찾았습니다.
- Travers Carter의이 답변 과
- Seumas Mackinnon의이 블로그 게시물 .
위의 내용을 읽고 나면 빠른 해결책이 줄을 추가하는 것이라는 결론에 도달 할 수 있습니다 (마지막의 "예제 가상 호스트"참조).
FcgidOutputBufferSize 0
Apache 구성 파일 (예 : httpd.conf), FCGI 구성 파일 (예 : fcgid.conf) 또는 가상 호스트 파일 (예 : httpd-vhosts.conf)에 있습니다.
위의 (1)에서 "OutputBufferSize"라는 변수가 언급되었습니다. 이것은 FcgidOutputBufferSize
(2)에 언급 된의 이전 이름입니다 ( mod_fcgid에 대한 Apache 웹 페이지 의 업그레이드 노트 참조 ).
세부 사항 및 두 번째 솔루션
위의 솔루션은 전체 서버 또는 특정 가상 호스트에 대해 mod_fcgid가 수행하는 버퍼링을 비활성화합니다 . 이로 인해 웹 사이트의 성능이 저하 될 수 있습니다. 반면에 PHP는 자체적으로 버퍼링을 수행하기 때문에 그렇지 않을 수 있습니다.
mod_fcgid 의 버퍼링 을 비활성화하지 않으 려면 다른 해결책 이 있습니다 . 이 버퍼를 강제로 플러시 할 수 있습니다 .
아래 코드는 Joeri Sebrechts가 제안한 솔루션을 기반으로합니다.
<?php
ob_end_clean();
header("Connection: close");
ignore_user_abort(true); // just to be safe
ob_start();
echo('Text the user will see');
echo(str_repeat(' ', 65537)); // [+] Line added: Fill up mod_fcgi's buffer.
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush(); // Strange behaviour, will not work
flush(); // Unless both are called !
// Do processing here
sleep(30);
echo('Text user will never see');
?>
추가 된 코드 줄이 본질적으로하는 일은 mod_fcgi 의 버퍼를 채우고 강제로 플러시하는 것입니다. 해당 지시문FcgidOutputBufferSize
에 대한 Apache 웹 페이지에 언급 된대로 변수 의 기본값 이 "65536" 이기 때문에 숫자 "65537"이 선택되었습니다 . 따라서 환경에 다른 값이 설정되어있는 경우 그에 따라이 값을 조정해야 할 수 있습니다.
내 환경
- WampServer 2.5
- Apache 2.4.9
- PHP 5.5.19 VC11, x86, 비 스레드 세이프
- mod_fcgid / 2.3.9
- Windows 7 Professional x64
가상 호스트 예
<VirtualHost *:80>
DocumentRoot "d:/wamp/www/example"
ServerName example.local
FcgidOutputBufferSize 0
<Directory "d:/wamp/www/example">
Require all granted
</Directory>
</VirtualHost>