다운로드가 중단되면 PHP + Fcgid가 중단됩니다.

다운로드가 중단되면 PHP + Fcgid가 중단됩니다.

메모:관리자 여러분, ServerFault로의 마이그레이션에 투표해 주세요.

. mod_fcgid​대부분의 요청에서 이 방법은 잘 작동하지만 파일을 다운로드했지만 완료되기 전에 다운로드를 중단하면 파일을 제공하는 php-cgi 프로세스가 해당 파일에 도달할 때까지 더 많은 데이터 쓰기를 시도하는 것을 차단합니다 IPCCommTimeout. 제한 시간에 도달하면 프로세스가 중단되고 프로세스가 다른 요청 서비스를 다시 시작합니다.

출력을 캡처하는 것이 없으면 중단되도록 설정할 수 있는 fcgid에 대한 사용 가능한 설정이 있습니까? PHP에서 처리할 수 있는 일이 있나요?

다운로드가 중단되지 않으면 문제가 발생하지 않습니다. 사실 gddflvplayer를 사용하여 FLV 파일을 스트리밍하려고 했기 때문에 이 사실을 알아차렸는데, 처음 몇 개의 프레임을 가져온 다음 다른 프레임을 재생하라는 간단한 요청을 보내는 것처럼 보이며 이로 인해 동일한 문제가 발생합니다.

참고로 이것은 매달린 CGI 프로세스의 흔적입니다. 아마도 도달했을 때 프로세스 관리자에 의해 결국 중단될 때까지 이 상태로 유지됩니다 IPCCommTimeout. 내 생각에는 호출 결과를 출력하려고 시도하는 중이지만 readfile()Apache가 더 이상 수신하지 않는 것 같습니다(사용자가 요청을 취소했기 때문에).

root@some-machine:~# strace -p 24837
Process 24837 attached - interrupt to quit
write(3, "\5|A\313%\35\337\376\275\237\230\266\242\371\37YjzD<\322\215\357\336:M\362P\335\242\214\341"..., 17432

로그에는 시간 초과로 인해 요청이 결국 회수되었음을 나타냅니다.

mod_fcgid: read data timeout in 240 seconds

다운로드 코드는 readfile몇 가지 헤더도 포함된 파일을 제공하는 데 사용됩니다(참고: 이 코드에서는 테스트 문제를 피하기 위한 Header래퍼일 뿐입니다 ).header()

$filepath    = '/some/path/foo.flv';
$filename    = 'foo.flv';
$disposition = 'inline';

$h = Header::get();
$h->send('Pragma: public');
$h->send('Content-Transfer-Encoding: binary');
$h->send('Content-type: ' . FileSystem::get()->getMimeType($filepath));
$h->send('Content-Length: ' . FileSystem::get()->getFileSize($filepath));
$h->send('Content-Disposition: ' . $disposition . '; filename="' . $filename . '"');
$h->send('Content-transfer-encoding: 8bit');
$h->send('Expires: 0');
$h->send('Pragma: cache');
$h->send('Cache-Control: private');

flush();
readfile($filepath);

관련 정보