이 글은 PHP의 fastcgi_finish_request와 그 비차단 코드에 대한 소개를 제공합니다. 이는 특정 참조 가치가 있습니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
실제 프로젝트에서는 프론트엔드에서 보낸 요청을 백엔드에서 오랜 시간 처리해야 하는 경우가 많습니다. 하지만 사용자에게 더 나은 경험을 제공하기 위해서는 백엔드에서 처리할 PHP 장기 작업을 차단하지 않으며 페이지 요청에 빠르게 응답하므로 여기서는 fastcgi_finish_request의 적용을 요약합니다. 물론 PHP에서 Non-Blocking을 구현하는 방법은 비동기 스크립트, Swoole 등 여러 가지가 있지만 개인적으로는 fastcgi_finish_request가 가장 간단하고 편리하다고 생각합니다.
(PHP 5 >= 5.3.3, PHP 7)
fastcgi_finish_request — 모든 응답 데이터를 클라이언트로 플러시
boolean fastcgi_finish_request (void)이 함수는 모든 응답을 플러시(flush)합니다. 데이터를 클라이언트에 전달하고 요청을 종료합니다. 이를 통해 실행하는 데 오랜 시간이 걸리는 작업이 클라이언트가 연결을 종료한 후에도 계속 실행될 수 있습니다.
성공하면 TRUE를 반환하고, 실패하면 FALSE를 반환합니다
PHP는 웹 서버와 함께 PHP-FPM(FastCGI 프로세스 관리자)을 사용하며, 이는 fastcgi_finish_request()를 통해 즉시 종료될 수 있습니다. 함수 세션 동안 PHP 스레드는 백그라운드에서 계속 실행될 수 있습니다. 즉, 이 함수는 php-fpm의 프로세스 관리 방법에만 사용할 수 있습니다
코드가 이 위치까지 실행되는 동안에는 요청의 연결이 끊어지고 매개변수가 클라이언트에 반환됩니다. 다음 코드는 클라이언트와 관련이 없습니다. 즉, 페이지의 콘텐츠 출력은 fastcgi_finish_request 함수 앞에 배치되어야 합니다. fastcgi_finish_request()가 클라이언트 연결을 종료한 후에도 실행 시간은 여전히 max_execution_time 시간 초과의 영향을 받습니다. 시간이 오래 걸리면 set_time_limit(0)을 설정해야 합니다
높은 동시성에서 실행 시간이 너무 길면 fastcgi 프로세스가 충분히 사용되지 않고 해제될 수 없습니다. 502 오류가 발생합니다.
echo "program start..."; file_put_contents('/tmp/garylog.log','start-time:'.date('Y-m-d H:i:s')."\n", FILE_APPEND); fastcgi_finish_request();sleep(1); // set_time_limit(0); // sleep(150); $num = 25; $num += 1; sleep(5); echo 'debug...'; file_put_contents('/tmp/garylog.log', 'start-proceed:'.$num.',时间'.date('Y-m-d H:i:s')."\n", FILE_APPEND); sleep(10); file_put_contents('/tmp/garylog.log', 'end-time:'.date('Y-m-d H:i:s')."\n", FILE_APPEND);
php-fpm이 아닌 호환
코드 이식성 측면에서 다음을 첨부할 수 있습니다. 코드 코드: if (!function_exists("fastcgi_finish_request")) {
function fastcgi_finish_request() {
}
}
는 fpm이 아닌 환경에서 코드 배포 문제를 일으키지 않습니다.
프로세스가 단일 프로세스에서 실행되는지 확인하세요.
위에서 언급한 문제와 관련하여: 높은 동시성에서 실행 시간이 너무 길어지면 fastcgi 프로세스가 부족해집니다. 시간에 맞춰 출시되었습니다. 동시에 우리의 요구 사항은 트리거링에만 해당되며 매번 실행할 필요는 없습니다. 그런 다음 프로세스 중복을 피하기 위해 다음 방법을 사용하는 것을 고려할 수 있습니다.
$processId = realpath(__FILE__) . '-' . get_class($this); $filename = md5($processId); $file = '/tmp/'.$filename; if(!file_exists($filename)){ file_put_contents($file, getmypid()); }else{ return true; } ## do somthing 需要长时间处理的代码 //处理完成后删除进程id记录文件 unlink($file);
PHP의 마법 같은 fastcgi_finish_request는 fastcgi_finish_request() 함수를 사용하여 비동기 작업을 구현하고 응답 속도를 향상시킵니다
위 내용은 PHP의 fastcgi_finish_request 소개 및 비차단 코드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!