스크립트 시간 초과로 인해 Apache 및 FPM 링크가 끊어졌습니다.

스크립트 시간 초과로 인해 Apache 및 FPM 링크가 끊어졌습니다.

Apache + PHP-FPM을 설정하려고 합니다. 그러나 오랫동안 실행되는 스크립트가 실행되어 결국 시간 초과되었습니다. 이로 인해 Apache와 FPM 간의 링크가 끊어져 결국 전체 사이트가 다운되었습니다...

--idle-timeout에 도달하면 전체 사이트가 다운되는 것을 방지할 수 있는 방법이 있습니까?

FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -idle-timeout 18000 -pass-header Authorization

답변1

php-fpm에 대한 Apache 요청시간 초과에 도달하면 중단됩니다.. 따라서 사용자에게도 마찬가지입니다. 최종 클라이언트가 응답을 받기를 원한다면 다음 세 가지 가능성을 염두에 두어야 합니다.

  1. 시간 초과 값을 늘리십시오 (PHP 응용 프로그램이 그보다 느리기 때문에)
  2. 해당 요청에 대해 PHP 애플리케이션을 더 빠르게 만들어 보십시오.
  3. PHP 애플리케이션에서 걸리는 시간을 계산하고 시간 초과 값보다 오래 걸리는 경우 오류 메시지로 응답하도록 하세요.

솔루션 #2는 일반적인 개발자 선택 IMHO입니다.

답변2

장기 실행 스크립트는 브라우저/Apache에서 실행하면 안 됩니다. FPM 대신 PHP CLI를 사용하여 백그라운드에서 실행해야 합니다. CLI 스크립트는 시간 초과되지 않으며 Apache 작업을 방해하지 않습니다.

cronjob을 사용하여 스크립트가 정기적으로 실행되도록 예약하거나 임시 파일 작성과 같은 작업을 수행하여 브라우저에서 스크립트가 실행되도록 할 수 있습니다(예: run_script웹 사이트 디렉터리에 라는 파일을 넣고 스크립트 끝에서 제거). ) 데이터베이스나 다른 백엔드에 플래그를 설정하는 것입니다.

두 번째 방법을 사용하는 경우에도 이 파일/데이터베이스 항목이 있는지 확인하고 해당 항목이 발견되면 스크립트를 실행하는 cronjob(1분에 한 번씩 실행 가능)이 필요합니다(이를 모니터링하는 리스너를 만들 수도 있습니다). 1분에 한 번이 아니라 지속적으로 수행되지만 이는 꽤 집약적이며 대부분의 사용 사례에서는 과잉일 수 있습니다.)

일단 실행되면 사용자에게 다시 보내는 것은 "잠깐만 기다려주세요. 요청을 처리 중입니다. 몇 분 후에 다시 확인해 주세요."와 같은 알림입니다. 이렇게 하면 요청을 계속 실행하기 위해 브라우저를 열어 둘 필요가 없으며 그동안 다른 작업을 수행할 수도 있습니다.

관련 정보