>PHP 프레임워크 >ThinkPHP >ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능

ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능

咔咔
咔咔원래의
2020-12-04 13:14:30224검색
"

이 기사에서는 컨트롤러의 최종 실행 프로세스와 사용된 두 가지 고급 속성에 대해 간략하게 설명합니다. 하나는 fastcgi_finish_request 메서드의 영리한 사용이고, 다른 하나는 특성 기능입니다. 개념을 어느 정도 이해했습니다.

1. 데이터를 터미널로 출력하는 방법<span class="suffix"></span>

컨트롤러에서 메소드를 실행한 후 의 실행 메소드로 응답 데이터를 보냅니다. App 클래스가 실행되었으며 이제 끝났습니다.

여기 데이터가 결국 어디에 반환될지 조금 혼란스러우신가요?

ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능
애플리케이션 실행

여기서부터 모든 것이 시작되기 전에 작성된 프레임워크 실행 프로세스, 라우팅, 컨트롤러 인스턴스화입니다.

그래서 run 메소드가 실행되면 해당 결과가 여기에 반환됩니다.

ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능
애플리케이션을 실행하고 응답하세요.

코드의 이 부분 Container::get('app')이 App 클래스의 인스턴스를 반환한다는 점을 모두 아셔야 합니다.

그런 다음 App 클래스를 통해 run 메소드를 실행하면 앞서 언급한 모든 내용이 표시됩니다.

아래 사진은 허리 중앙부터 카카가 만든 마인드맵입니다. 앞부분은 없고, 뒷부분의 지식포인트는 모두 이 마인드맵에 적혀있습니다.

ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능
실행 프로세스

run 메소드가 실행된 후 Container::get('app')->run()->send()send 메서드가 App 클래스에서 실행된다고 생각하는 사람이 몇 명이나 될까요? Container::get('app')->run()->send()send这个方法,有多少人会认为在App类里边执行send方法。

其实不是的,回想一下之前执行控制器方法然后返回的响应结果是什么?

如果你不是很粗略的看都会记得是Response的一个对象实例。

所以说send方法会去response类里边去执行。

ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능
ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능

先不看其它的,先看这行代码$this->app['hook'],现在知道是执行的那里吗?

这种形式就是通过访问数组形式去访问对象的属性,也就是之前解析的ArrayAccess这个类。当访问的属性不存在时会去执行offsetGet,然后执行魔术方法__get,最终通过make方法返回实例,这一切的操作都是在容器中。

对这行代码具体是监听的什么就不去做解析了。

接着需要看处理ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능的这行代码$data = $this->getContent();

아니요, 이전에 컨트롤러 메서드를 실행한 후 반환된 응답 결과가 무엇인지 기억하시나요?

아주 대충 보지 않으면 Response의 객체 인스턴스라는 것을 기억하실 겁니다. 🎜🎜그래서 send 메소드는 응답 클래스에서 실행됩니다. 🎜🎜클라이언트로 데이터 보내기🎜클라이언트에게 데이터 보내기🎜🎜🎜다른 것을 먼저 보지 말고, 먼저 이 코드 줄을 살펴봅시다$this->app['hook'], 이제 어디에 있는지 아시나요? 실행되나요? 🎜🎜이 형태는 앞서 분석했던 ArrayAccess 클래스인 배열에 접근하여 객체의 속성에 접근하는 형태입니다. 액세스된 속성이 존재하지 않는 경우 offsetGet이 실행된 후 매직 메서드 __get이 실행되고 마지막으로 make 메서드를 통해 인스턴스가 반환됩니다. 이 모든 작업은 컨테이너에서 수행됩니다. 🎜🎜이 코드 줄이 정확히 무엇을 모니터링하는지 분석하지는 않겠습니다. 🎜🎜그런 다음 출력 데이터를 처리하는 이 코드 줄을 살펴봐야 합니다$ data = $this->getContent();🎜🎜이 메소드가 하는 일은 전달된 데이터를 이 클래스의 컨텐츠 속성에 할당하는 것입니다. 🎜
ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능
출력 데이터 가져오기

사실 이 출력 데이터 가져오기 방법에서는 원으로 표시된 첫 번째 부분을 살펴보시기 바랍니다.

데이터 처리가 전혀 없고 그냥 반환되는 것을 볼 수 있습니다. 따라서 프레임워크에는 읽어보면 좋은 점과 나쁜 점이 있습니다. 그렇지 않으면 자주 사용하는 것이 무엇인지 혼란스러울 것입니다. . 도구는 아무것도 모릅니다.

ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능
데이터 처리

다음 단계는 Trace 디버깅 주입으로, 구성 파일을 통해 구성하고 디버그 클래스를 호출하여 구현하는데, 여기서는 자세히 설명하지 않습니다.

그러면 캐싱에 대한 판단이 나오는데, 캐싱에 대해서는 다음 글에서 따로 다루므로 통과됩니다.

다음 단계는 응답 헤더를 설정하고 HTTP 헤더가 전송되었는지 감지하는 것입니다. 이는 매우 중요하며 거의 노출되지 않는 지식 포인트이기도 합니다.

  • headers_sent(): HTTP 헤더가 전송되었는지 감지
  • http_response_code(): 응답의 HTTP 상태 코드 가져오기/설정
  • header: 이 함수는 원본 HTTP 헤더를 클라이언트에 보냅니다. .
检测 HTTP 头是否已经发送
HTTP 헤더가 전송되었는지 확인

마지막 단계인 it came, it came, echo와 함께 와서 메소드 실행$this->sendData($data);

마지막 단계는 며느리 같은 느낌을 줍니다. 법이 시어머니가 되었습니다 드디어 터미널에 도착한 것 같은 느낌, 수십일의 슬픔이 울려퍼졌습니다!

이 메아리 카카에 도달하기 위해 우리는 9981개의 어려움을 겪었습니다! 전투는 아직 끝나지 않았습니다. 동지들은 여전히 ​​열심히 노력해야 합니다!

ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능
출력 데이터

여기에서는 프레임워크 실행, 애플리케이션 초기화, 경로 감지, 컨트롤러 인스턴스화, 응답 인스턴스로 반환, 항목 파일을 통해 전송 메서드를 실행합니다.

마지막으로 데이터를 터미널에 출력하는데, 이것이 바로 에코입니다.

여기에서의 전투는 끝났지만 아래에는 여전히 매우 중요한 지식 포인트가 있는데, 카카가 이에 대해 다시 언급하여 설명하겠습니다.

2. fastcgi_finish_request 메소드는 이전 섹션 <span class="suffix"></span>

을 교묘하게 사용합니다. : 4px; 여백: 0 2px; 배경색: rgba(27,31,35,.05); 글꼴 계열: 연산자 Mono, Consolas, Monaco, monospace; ( 271, 93, 108);">Container::get('app')->run()->send();응답 클래스에서 send 메소드가 실행되어 데이터가 출력됩니다. . Container::get('app')->run()->send();在response类中执行了send方法,输出了数据。

但是在ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능之后还执行了一个方法fastcgi_finish_request();

하지만 데이터 출력 후 메소드도 실행됩니다. fastcgi_finish_request();에 제공된 주석은 페이지 응답을 개선하기 위한 것이므로 미스터리를 자세히 살펴보겠습니다.

PHP 공식 웹사이트에서 이 구절을 봤습니다

스크립트는 fastcgi_finish_request() 이후에도 FPM 프로세스를 차지합니다. 따라서 장기 실행 작업에 과도하게 사용하면 pm.max_children까지 모든 FPM 스레드를 차지할 수 있습니다. 웹 서버에 게이트웨이 오류가 발생했습니다.

fastcgi_finish_request() 후에도 스크립트는 여전히 FPM 프로세스를 차지합니다. 따라서 장기간 실행되는 작업에 이를 과도하게 사용하면 모든 FPM 스레드가 pm.max_children까지 묶일 수 있습니다. 이로 인해 웹 서버에 게이트웨이 오류가 발생합니다.

그러므로 이 방법에 대한 철저한 이해 없이 자신의 프로젝트에 이 방법을 사용하지 마세요.

다음으로 Kaka는 이 방법의 사용법을 보여주기 위해 사례를 사용할 것입니다. 프로젝트에서 사용해야 하는 경우 문서를 주의 깊게 읽고 문제에 주의하세요.

사례 시연

🎜

회사에서 사용자에게 알림을 보내야 하는 업무가 있는데, 보내는 시간이 너무 길어서 시간이 많이 걸리기 때문에 수십 초가 걸릴 수도 있고, 더 심각하게는 브라우저 연결 시간이 직접적으로 발생하게 됩니다. 밖으로.

한 가지 문제는 사용자 경험이 오래 기다려야 한다는 점이며, 경험이 확실히 좋지 않습니다.

위의 두 가지 문제를 해결하기 위해 오늘 이야기할 내용은 fastcgi_finish_request 가 유용합니다. fastcgi_finish_request就派上了用场。

理解

对这个函数的理解其实就是发送响应给浏览器,用户等待时间大大缩短,但是PHP进程还是在运行的。

这样就达到了来个目的,就类似于我们经常说的异步执行。

直观的来说就是发送邮件有可能需要10秒,但是用户是没有感知的,用户点击发送邮件之后直接就返回发送成功,浏览器响应结束,用户做其它事情,后台进程继续执行发送邮件的任务。

案例

ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능
ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능

具体代码

<span style="display: block; background: url(https://files.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #282c34; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;"></span><code class="hljs" style="overflow-x: auto; padding: 16px; color: #abb2bf; display: -webkit-box; font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; font-size: 12px; -webkit-overflow-scrolling: touch; padding-top: 15px; background: #282c34; border-radius: 5px;"><span class="hljs-meta" style="color: #61aeee; line-height: 26px;"><?php</span><br/><span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">/**<br/> * 设置超时时间,变成不限制<br/> *<br/> */</span><br/>set_time_limit(<span class="hljs-number" style="color: #d19a66; line-height: 26px;">0</span>);<br/><br/><span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">/**<br/> * 本函数模拟非常耗时的任务,执行完毕需要5秒的时间<br/> */</span><br/><span class="hljs-function" style="line-height: 26px;"><span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">function</span> <span class="hljs-title" style="color: #61aeee; line-height: 26px;">writeFile</span><span class="hljs-params" style="line-height: 26px;">()</span><br/></span>{<br/>    $path = <span class="hljs-string" style="color: #98c379; line-height: 26px;">&#39;D:/phpstudy_pro/WWW/kaka.txt&#39;</span>;<br/>    file_put_contents($path,<span class="hljs-string" style="color: #98c379; line-height: 26px;">&#39;程序运行开始&#39;</span> . PHP_EOL,FILE_APPEND);<br/>    <span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">for</span>($i =<span class="hljs-number" style="color: #d19a66; line-height: 26px;">0</span>;$i < <span class="hljs-number" style="color: #d19a66; line-height: 26px;">5</span>;$i++) {<br/>        file_put_contents($path,time() . PHP_EOL,FILE_APPEND);<br/>        sleep(<span class="hljs-number" style="color: #d19a66; line-height: 26px;">1</span>);<br/>    }<br/><br/>    file_put_contents($path,<span class="hljs-string" style="color: #98c379; line-height: 26px;">&#39;程序运行结束&#39;</span> . PHP_EOL,FILE_APPEND);<br/><br/>}<br/><br/><span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">/**<br/> * 输出文字标记,任务开始<br/> */</span><br/><span class="hljs-keyword" style="color: #c678dd; line-height: 26px;">echo</span>(<span class="hljs-string" style="color: #98c379; line-height: 26px;">&#39;任务开始&#39;</span>);<br/><br/><span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">/**<br/> *  后台执行非常耗时的任务<br/> */</span><br/>register_shutdown_function(writeFile);<br/><br/><span class="hljs-comment" style="color: #5c6370; font-style: italic; line-height: 26px;">/**<br/> * 立即发送请求<br/> */</span><br/>fastcgi_finish_request();<br/><br/><br/><br/></code>
ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능
ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능

以上测试全部使用linux系统进行测试哈,否则你看不到直观的效果。

经过上面的演示,响应非常快,浏览器响应结束后,后台程序依然进行执行每秒执行一个时间戳。

以上就是对fastcgi_finish_request

이해🎜🎜 이 기능에 대한 이해는 실제로 브라우저에 응답을 보내는 것이며, 사용자는 짧은 시간 동안 기다려야 하지만 PHP 프로세스는 계속 실행 중입니다. 🎜🎜이것은 우리가 종종 비동기 실행이라고 부르는 것과 유사한 목적을 달성합니다. 🎜🎜직관적으로 말하면 이메일을 보내는 데 10초가 걸릴 수 있지만 사용자는 이를 인식하지 못합니다. 사용자가 이메일을 보내기 위해 클릭하면 바로 전송 성공이 반환되고 브라우저 응답이 종료되며 사용자는 다른 작업을 수행합니다. 백그라운드 프로세스가 계속해서 이메일을 보냅니다. 🎜🎜케이스🎜
데모 사례
🎜특정 코드🎜rrreee
시연 결과
🎜위 테스트는 모두 Linux 시스템을 사용하여 수행되었습니다. 그렇지 않으면 직관적인 효과를 볼 수 없습니다. 🎜🎜위 시연 후 응답이 매우 빠릅니다. 브라우저가 응답한 후에도 백그라운드 프로그램은 여전히 ​​매초 타임스탬프를 실행합니다. 🎜🎜위는 fastcgi_finish_request 방법 단순성 소개, 당신도 관심이 있다면 간단한 시도를 해볼 수 있으며, 이는 작은 비밀을 더 잘 이해하는 데 도움이 될 것입니다. 🎜

3. 특성 특성 설명<span class="suffix"></span>

카카는 이 특성을 2년 전에 분석했어야 합니다. trait슈퍼 클래스라고도 합니다.

이 기능은 PHP5.4에서만 추가된 기능입니다. 이 기능은 자주 사용되는 인터페이스도 아니고 클래스도 아닙니다.

이 기능은 단일 상속만 가능하다는 PHP의 주요 약점을 해결하기 위한 것입니다. 하지만 다중 상속이라고 할 수는 없습니다. 엄밀히 말하면 다중 상속과 유사한 기능일 뿐입니다.

다음으로 케이스를 보여드리겠습니다.

테스트 파일 1을 생성하고 해당 클래스 이름을 반환합니다.

ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능
슈퍼 클래스

의 첫 번째 파일은 test1 파일을 생성하고 해당 클래스 이름을 반환합니다.

ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능
슈퍼 클래스

의 두 번째 파일은 정보를 출력하는 컨트롤러 파일을 생성합니다.

ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능
컨트롤러를 생성한 다음

해당 슈퍼 클래스 파일을 컨트롤러에 도입합니다. 여기서 주목해야 할 것은 첫 번째 원으로 표시된 상자가 슈퍼 클래스 테스트 파일을 직접 소개한다는 것입니다.

ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능
컨트롤러에 해당 슈퍼 클래스 파일을 도입하세요

그러면 직접 접근하여 무엇이 반환되는지 확인할 수 있습니다.

ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능
Return results

위 그림에서 메서드가 Test 슈퍼 클래스 파일을 반환하는 것을 볼 수 있지만 이 컨트롤러도 기사 시작 부분에서 언급한 슈퍼 클래스인 Controller 컨트롤러를 기반으로 합니다. 다중 상속 기능을 구현하면 됩니다.

하지만 여기서 문제가 발생합니다. 아래 오류 메시지를 참조하세요.

ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능
오류 메시지

위 그림의 오류 메시지는 컨트롤러에서 두 개의 슈퍼 클래스를 사용하여 발생하며, 아래 그림에서는 이를 사용합니다.

ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능
컨트롤러는 두 개의 슈퍼 클래스를 사용합니다

이 오류 메시지를 해결하는 방법은 무엇입니까? 다음으로, 이 클릭의 리듬을 따르십시오.

오류 메시지 해결

이전 문제를 해결하기 전에 먼저 이 문제의 원인을 이해해야 합니다.

이 오류가 발생하는 이유는 참조된 두 특성에 동일한 이름의 hello 함수가 있고 충돌이 있기 때문입니다.

그러나 메서드 이름을 수동으로 변경하는 것이 여전히 매우 편리하기 때문에 일상적인 개발에서는 이러한 상황을 피할 수 있지만 여기에서는 Kaka가 이 문제를 해결하는 방법을 가르쳐줍니다.

첫 번째는 한 특성의 hello 메서드를 사용하여 다른 특성의 동일한 이름의 메서드를 덮어쓰는 것입니다. 두 메서드의 내용이 일관되기 때문에 여기서 덮어쓰는 대신 직접 선택합니다. 더 이상 충돌이 발생하지 않도록 별칭을 as로 지정하세요. as 키워드에는 메소드의 액세스 제어를 수정하는 또 다른 용도가 있습니다.

ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능
솔루션 구현

위 그림을 변경한 후 다시 방문하여 반환된 결과를 살펴보세요.

ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능
결과 반환

그러면 이때 일부 파트너에게 질문이 있을 것입니다. 즉, 사례 인쇄 결과는 항상 Test 클래스의 방법이었고 Test1 클래스의 방법은 인쇄되지 않았습니다.

그럼 방문방법! 살펴보겠습니다.

ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능
슈퍼 클래스 2에 접근하기 위한 코드

위 그림을 보면 접근 방식이 별칭 제어 접근으로 변경된 것을 확인할 수 있는데, 그럼 접근 결과를 살펴보겠습니다.

超类二ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능
슈퍼 클래스 2 반환 결과

위 그림에서 볼 수 있듯이 반환 결과는 슈퍼 클래스 Test1의 반환 결과입니다.

그래서 as의 사용법에 대해서는 사용법을 검색해야 할 때도 있습니다. 세부 사항에 주의를 기울이면 많은 지식을 배울 수 있습니다.

Summary<span class="suffix"></span>

컨트롤러의 소스코드 분석을 위한 것입니다. 카카는 소스코드를 통해 컨트롤러가 어떻게 인스턴스화되는지 분석합니다.

ArrayAccess와 매직 메소드 간의 호출 관계에 대해서도 다시 논의한 바 있습니다. 문제를 생각하려면 자신만의 생각이 있어야 합니다.

컨트롤러 등에 접근한 후 데이터에 응답하는 방법입니다.

소스코드에서 fastcgi_finish_request 메소드의 영리한 사용에 대해서도 배웠는데, 이 기능을 사용할 때 Kaka에 대해 언급된 두 가지 사항에 주의해야 합니다.

마지막으로 슈퍼클래스에 대한 간단한 사례 설명이 있습니다.

배움에 대한 끈기, 블로그에 대한 끈기, 공유에 대한 끈기는 카카가 경력 이후부터 늘 지켜온 신념입니다. 거대한 인터넷에 올라온 카카의 글이 여러분에게 조금이나마 도움이 되기를 바랍니다. 카카 다음호에서 만나요

위 내용은 ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.