PHP에서는 요청이 끝나려고 할 때 두 가지 메소드가 실행됩니다. 메소드 이름은 각각 Register_shutdown_function 및 fastcgi_finish_request입니다. 실행 시점은 비슷하지만 기능과 적용 시나리오는 다릅니다. 두 방법의 차이점을 비교하는 것은 이 기사의 초점이 아닙니다. 이 기사의 초점은 두 가지 방법의 적용 시나리오를 설명하는 것입니다.
함수:
요청 요청이 실행되면 등록된 메서드가 호출됩니다. 실행 중에 오류가 발생하여 이 요청이 강제로 종료되더라도 등록된 메서드는 계속 실행됩니다.
애플리케이션 시나리오 1:
해당 기능을 사용하여 일부 오류에 대한 자세한 정보를 캡처할 수 있습니다. 샘플 코드는 다음과 같습니다.
<span>function</span><span> catch_error(){ </span><span>$error</span> =<span> error_get_last(); </span><span>if</span>(<span>$error</span><span>){ </span><span>var_dump</span>(<span>$error</span><span>); } } </span><span>register_shutdown_function</span>("catch_error"<span>); </span><span>ini_set</span>('memory_limit','1M'<span>); </span><span>$content</span> = <span>str_repeat</span>("aaaaaaaaaaaaaaaaaaaaaaa",100000<span>); </span><span>echo</span> "aa";
출력 정보는 다음과 같습니다.
array(4) { ["type"]=> ; int(1) ["message"]=> string(80) "1048576바이트의 허용 메모리 크기가 소진되었습니다(2300001바이트 할당을 시도했습니다)" ["file"]=> string(39) " ["line" ]=> int(13) }
위 코드에서는 Out of memory 오류를 정상적으로 캡쳐한 것을 볼 수 있습니다.
신청 시나리오 2
요청이 정상적으로 종료되었는지 확인하세요. 샘플 코드는 다음과 같습니다.
<span>function</span><span> monitor(){ </span><span>global</span><span>$is_end</span><span>; </span><span>if</span>(<span>$is_end</span> == <span>true</span><span>){ </span><span>echo</span> "success"<span>; }</span><span>else</span><span>{ </span><span>echo</span> "fail"<span>; } } </span><span>register_shutdown_function</span>("monitor"<span>); </span><span>$is_end</span> = <span>false</span><span>; </span><span>die</span><span>(); </span><span>$is_end</span> = <span>true</span>;
페이지 출력 결과는 다음과 같습니다. 실패
는 die 함수가 호출되어도 표시됩니다. 등록된 모니터 기능도 정상적으로 실행됩니다.
기능:
클라이언트에 데이터를 플러시합니다. 이 메서드를 호출한 후에는 출력 내용이 클라이언트에 출력되지 않습니다.
애플리케이션 시나리오:
요청 콘텐츠 처리 중 일부를 클라이언트에 보낼 필요가 없는 경우 먼저 클라이언트에 대한 콘텐츠 출력을 생성한 후 이 메서드를 호출할 수 있습니다. . 메서드가 호출되면 콘텐츠가 클라이언트에 출력됩니다. 클라이언트에 출력할 필요가 없는 콘텐츠는 이 메서드 뒤에 배치할 수 있습니다. 이렇게 하면 응답성이 향상됩니다. 샘플 코드는 다음과 같습니다.
<span>echo</span> "a"<span>; fastcgi_finish_request(); </span><span>echo</span> "b"<span>; </span><span>file_put_contents</span>("/tmp/test","abc.com"<span>); </span><span>die</span><span>(); </span><span>file_put_contents</span>("/tmp/test2","测试数据");
페이지 출력 결과는 a
fastcgi_finish_request 메소드 뒤의 echo "b"가 출력되지 않는 것을 알 수 있습니다. 클라이언트. 하지만 /tmp/test 디렉터리에 파일이 정상적으로 생성된 것을 볼 수 있습니다. 그런데 /tmp/bo56 파일이 생성되지 않았습니다
위 내용은 관련 내용을 포함하여 Register_shutdown_function 및 fastcgi_finish_request를 소개하고 있어 PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.