2012-05-08 2 views
4

Nginx는 PHP-FPM 프로세스와 관련이 없다는 것을 알고 있습니다.하지만 사용자가 중단되어 불필요한 작업을하거나 자원을 낭비하지 않으면 PHP-FPM 프로세스가 중단되는 경우 많은 것을 선호합니다. PHP-FPM/Nginx에 들어 trigger_error에 관계없이 사용자의 중단으로 발생합니다 :사용자가 요청을 중단 할 때 PHP-FPM 프로세스가 종료되도록하려면 어떻게해야합니까? (Nginx)

<?php 

sleep(30); 
trigger_error('Still happened?'); 

?> 

을 어떻게 사용자가 PHP-FPM에 대한 중단 할 수 있습니까? (가능한 경우)

답변

1

클라이언트 연결을 해제하여 스크립트가 중단되도록 결정할 수 있습니다 ( ). PHP 매뉴얼에 따르면

: Connection Handling

클라이언트 연결 해제 후 PHP 스크립트의 실행을 중지합니다이 동작을 사용 ignore_user_abort

ignore_user_abort(FALSE);을 설정합니다.

ignore_user_abort(TRUE);은 클라이언트 연결을 무시하고 스크립트를 계속 실행합니다.

두 번째 경우에는 작업을 수행하는 데 충분한 시간을 스크립트에 제공하기 위해 필요에 따라 set_time_limit을 사용할 수도 있습니다.

이 설정은 PHP-FPM/nginx 환경에서 성공적으로 테스트되었습니다.

1

이것은 php-fpm에서 구현되지 않았습니다. 자세한 정보는 here입니다.

설정 ignore_user_abort(FALSE)은 PHP가 응답을 계산 중일 때가 아니라 소켓을 통해 데이터를 보낼 때만 작동합니다.

이상적으로는 php-fpm으로 구현해야하지만, PHP가 대부분 단일 스레드 인 경우 매우 쉽지 않을 것이라고 생각합니다.

긴급한 상황에서는 끊어진 연결로 모든 php-fpm 프로세스를 종료 할 수 있습니다. 당신은 로컬 호스트에 PHP-FPM 듣기가 가정 : 9000이 작동합니다 : 당신은 당신의 nginx 설정을 확인해야

netstat -ntp | grep 127.0.0.1:9000 | grep php-fpm | grep CLOSE_WAIT |\ 
awk ' { print $7; } ' | cut -d/ -f1 | while read pid; do 
    echo "Killing php-fpm/$pid because client has closed connection" 
    kill $pid 
done 
0

을, PHP 스크립트의 동작을 설정하기 전에. @YAAK로 연결

설정은 nginx하지 항상 작업을 수행. 제 실제 상황에서는 PHP 측에서 무엇을 하든지 관계없이 스크립트를 중지 할 수 없습니다.

도울 수있는 의 nginx에 FastCGI를 매개 변수 fastcgi_ignore_client_abort (off에 기본 설정)에서 재생. 스크립트가 차단 될 수 있도록, sudo service php5-fpm restart :

또한, 수동 솔루션 (단지에 대한 개발 환경) (리눅스에)을 실행하는 것입니다.