접속 다루기

PHP에서 내부적으로 연결 상태가 유지됩니다. 4가지 가능한 상태가 있습니다.

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

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

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

스크립트는 내장 스크립트 타이머에 의해 종료될 수도 있습니다. 기본 시간 제한은 30초입니다. max_execution_time php.ini 지시문 또는 해당 php_value max_execution_time Apache httpd.conf 지시문과 set_time_limit() 함수를 사용하여 변경할 수 있습니다. 타이머가 만료되면 스크립트가 중단되고 위의 클라이언트 연결 해제 사례와 같이 종료 기능이 등록된 경우 호출됩니다. 이 종료 함수 내에서 connection_status() 함수를 호출하여 시간 초과로 인해 종료 함수가 호출되었는지 확인할 수 있습니다. 시간 초과로 인해 종료 함수가 호출되면 이 함수는 2를 반환합니다.

한 가지 주의할 점은 ABORTED 및 TIMEOUT 상태가 동시에 활성화될 수 있다는 것입니다. 이것은 사용자 중단을 무시하도록 PHP에 지시하면 가능합니다. PHP는 사용자가 연결을 끊었을 수 있다는 사실을 계속 인식하지만 스크립트는 계속 실행됩니다. 그리고 시간 제한에 도달하여 취소되면 종료 함수가 존재할 경우 호출됩니다. 이 경우 connection_status()가 3을 반환합니다.