![스크립트 시간 초과로 인해 Apache 및 FPM 링크가 끊어졌습니다.](https://linux55.com/image/139180/%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%20%EC%8B%9C%EA%B0%84%20%EC%B4%88%EA%B3%BC%EB%A1%9C%20%EC%9D%B8%ED%95%B4%20Apache%20%EB%B0%8F%20FPM%20%EB%A7%81%ED%81%AC%EA%B0%80%20%EB%81%8A%EC%96%B4%EC%A1%8C%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
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
Apache가 php-fpm에 요청합니다.시간 초과에 도달하면 중단됩니다.. 사용자도 마찬가지입니다. 최종 고객의 응답을 원한다면 다음 세 가지 가능성을 생각해 볼 수 있습니다.
- 시간 초과 값을 늘립니다(PHP 애플리케이션이 이보다 느리기 때문에).
- PHP 애플리케이션이 해당 요청을 더 빠르게 처리하도록 해보세요.
- PHP 애플리케이션에서 소요 시간을 계산하고 소요 시간이 제한 시간 값을 초과하는 경우 오류 메시지로 응답하도록 합니다.
IMHO, 솔루션 #2는 개발자에게 일반적인 선택입니다.
답변2
장기 실행 스크립트는 브라우저/Apache에서 실행하면 안 됩니다. 백그라운드에서 실행하려면 FPM 대신 PHP CLI를 사용해야 합니다. CLI 스크립트는 시간 초과되거나 Apache 작업을 방해하지 않습니다.
cronjob을 사용하여 주기적으로 실행되도록 스크립트를 예약하거나 임시 파일과 같은 항목을 작성하여 브라우저에서 스크립트가 실행되도록 할 수 있습니다(예: run_script
웹 사이트 디렉터리에 이름이 지정된 파일을 넣은 다음 스크립트 끝에서 삭제). ) 데이터베이스나 다른 백엔드에 플래그를 설정합니다.
두 번째 방법으로 갈 때 이 파일/데이터베이스 항목이 존재하는지 확인하고 발견된 경우 스크립트를 트리거하려면 cronjob(1분마다 실행 가능)이 필요합니다(이 파일/데이터베이스 항목을 지속적으로 모니터링하기 위해 리스너를 생성할 수도 있음). 1분에 한 번이 아니라 이는 매우 집중적이며 대부분의 사용 사례에서는 과잉일 수 있습니다.)
일단 트리거되면 사용자에게 다시 보내는 것은 "잠시만 기다려주세요. 요청을 처리 중입니다. 몇 분 후에 다시 확인해 주세요."와 같은 알림입니다. 이렇게 하면 요청 실행을 유지하기 위해 브라우저를 열어 둘 필요가 없으며 동시에 다른 작업을 수행할 수 있습니다.