update : 2015.11.03
php.shukuma.com

검색:
 
 
접속 다루기

접속 다루기

PHP는 내부적으로 접속 상태를 관리합니다. 3가지 상태가 존재합니다:

  • 0 - NORMAL
  • 1 - ABORTED
  • 2 - TIMEOUT

PHP 스크립트가 정상적으로 작동하고 있으면, NORMAL 상태가 활성화됩니다. 원격 클라이언트가 접속을 끊으면 ABORTED 상태 플래그가 켜집니다. 원격 클라이언트의 접속 차단은 보통 사용자가 중지 버튼을 누르는 경우입니다. PHP 내장 시간 제한(set_time_limit())에 걸리면, TIMEOUT 상태 플래그가 켜집니다.

클라이언트 접속 차단으로 인해 스크립트를 중단할 지 여부를 결정할 수 있습니다. 때때로 원격 브라우저가 출력을 받아들이지 않더라도 스크립트가 동작을 마쳐야 할 수 있습니다. 기본 동작은 원격 클라이언트 접속 차단 시에 스크립트를 중단합니다. 이 동작은 php.ini에서 ignore_user_abort 지시어나, , 아파치 .conf php_value ignore_user_abort 지시어, ignore_user_abort() 함수로 설정할 수 있습니다. PHP에 사용자 중단을 무시하도록 하지 않고 사용자가 중단하면, 스크립트는 종료됩니다. 한가지 예외는 register_shutdown_function()을 사용하여 종료 함수를 등록했을 경우입니다. 종료 함수가 있으면 사용자가 중단 버튼을 눌렀을 때, 스크립트에서 무언가를 출력하려 해서 PHP가 접속이 중단되었음을 알게 되었을 경우 종료 함수가 호출됩니다. 이 종료 함수는 정상적으로 스크립트 마지막에 종료될 때도 호출되므로, 클라이언트 접속 차단시 다른 동작을 하려면 connection_aborted() 함수를 이용할 수 있습니다. 이 함수는 접속이 취소되었을 때 TRUE를 반환합니다.

스크립트는 내장 스크립트 타이머에 의해 종료될 수도 있습니다. 기본 시간 제한은 30초입니다. 이는 php.ini max_execution_time 지시어나, 아파치 .conf php_value max_execution_time 지시어, set_time_limit() 함수로 바꿀 수 있습니다. 타이머가 초과되면 스크립트는 중단되고, 위의 클라이언트 접속 차단의 경우와 마찬가지로 종료함수가 있으면 호출됩니다. 종료 함수에서 connection_status() 함수를 호출하여 시간 초과가 종료 함수 호출을 유발하였는지 확인할 수 있습니다. 이 함수는 시간 초과가 원인으로 종료 함수를 호출하였을 때 2를 반환합니다.

ABORTED와 TIMEOUT 상태가 동시에 일어날 수 있는 점에 주의해야 합니다. 이는 PHP에 사용자 중단을 무시하도록 했을 때 일어날 수 있습니다. PHP는 사용자가 접속을 끊었음을 기록하지만, 스크립트는 계속 실행됩니다. 그리고 시간 제한에 도달하여 취소되면 종료 함수가 존재할 경우 호출됩니다. 이 경우 connection_status()가 3을 반환합니다.