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

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

咔咔
咔咔원래의
2020-12-29 11:07:151897검색

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

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

컨트롤러의 메소드가 실행되면 응답 데이터가 App의 실행 메소드로 전송됩니다. 클래스, 현재까지 실행이 완료되었습니다.

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

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

이전에 작성한 프레임워크 실행 프로세스, 라우팅, 컨트롤러 인스턴스화 등이 모두 여기에서 입력됩니다.

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

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

코드의 이 부분Container::get('app') App 클래스의 인스턴스를 반환한다는 것을 모두 알고 있어야 합니다. Container::get('app')应该都知道了是返回一个App类的实例。

然后通过App类去执行run方法,才会有之前讲过的一切。

下图是咔咔从半中腰做的一个思维导图,前面的没有,后边的所有知识点都会写在这个思维导图里。

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

执行完run方法就会去执行Container::get('app')->run()->send()

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

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

ThinkPHP 프레임워크에서 사용되는 fastcgi_finish_request 및 특성 기능🎜 🎜🎜실행 프로세스🎜🎜🎜run 메소드를 실행한 후 실행됩니다. Container::get('app')->run()->send() Send 메소드가 App 클래스에서 실행된다고 생각하는 사람이 몇 명이나 될까요? 🎜🎜아니요, 이전에 컨트롤러 메서드를 실행한 후 반환된 응답 결과가 무엇인지 기억하시나요? 🎜

아주 대충 보지 않으면 Response의 객체 인스턴스라는 것을 기억하실 겁니다.

그래서 send 메소드는 응답 클래스에서 실행됩니다.

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

다른 것은 보지 말고 먼저 이 코드 줄을 살펴보겠습니다.$this->app['hook'], 이제 어디서 실행되는지 아시나요? $this->app['hook'],现在知道是执行的那里吗?

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

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

接着需要看处理输出数据的这行代码$data = $this->getContent();

이 형태는 앞서 분석했던 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 헤더를 클라이언트에 보냅니다.

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

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

아내가 된 듯한 느낌을 줍니다. . 마치 엄마 같은 느낌, 드디어 터미널에 도착하고 수십 일의 슬픔이 울려 퍼졌습니다!

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

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

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

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

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

2. 이전 섹션에서 <span class="suffix"></span>

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

但是在输出数据之后还执行了一个方法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이 유용합니다.

이해

이 기능에 대한 이해는 실제로 브라우저에 응답을 보내는 것입니다. 사용자의 대기 시간은 크게 단축되지만 PHP 프로세스는 여전히 실행 중입니다.

이것은 우리가 종종 비동기 실행이라고 부르는 것과 유사한 목적을 달성합니다.

직관적으로 말하면 이메일을 보내는 데 10초가 걸릴 수 있지만 사용자는 이를 인식하지 못합니다. 사용자가 이메일을 보내기 위해 클릭하면 바로 전송 성공이 반환되고 브라우저 응답이 종료되며 사용자는 다른 작업을 수행합니다. 백그라운드 프로세스가 계속해서 이메일을 보냅니다.

Case

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

특정 코드

<span style="display: block; background: url("https://files.mdnice.com/point.png") 10px 10px / 40px no-repeat rgb(40, 44, 52); height: 30px; width: 444.812px; margin-bottom: -7px; border-radius: 5px;"></span><code class="hljs" style="overflow-x: auto; padding: 15px 16px 16px; color: rgb(171, 178, 191); display: -webkit-box; font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace; font-size: 12px; background: rgb(40, 44, 52); border-radius: 5px;"><span class="hljs-meta" style="color: rgb(97, 174, 238); line-height: 26px;"><?php</span><br/><span class="hljs-comment" style="color: rgb(92, 99, 112); font-style: italic; line-height: 26px;">/**<br/> * 设置超时时间,变成不限制<br/> *<br/> */</span><br/>set_time_limit(<span class="hljs-number" style="color: rgb(209, 154, 102); line-height: 26px;">0</span>);<br/><br/><span class="hljs-comment" style="color: rgb(92, 99, 112); 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: rgb(198, 120, 221); line-height: 26px;">function</span> <span class="hljs-title" style="color: rgb(97, 174, 238); line-height: 26px;">writeFile</span><span class="hljs-params" style="line-height: 26px;">()</span><br/></span>{<br/>    $path = <span class="hljs-string" style="color: rgb(152, 195, 121); line-height: 26px;">&#39;D:/phpstudy_pro/WWW/kaka.txt&#39;</span>;<br/>    file_put_contents($path,<span class="hljs-string" style="color: rgb(152, 195, 121); line-height: 26px;">&#39;程序运行开始&#39;</span> . PHP_EOL,FILE_APPEND);<br/>    <span class="hljs-keyword" style="color: rgb(198, 120, 221); line-height: 26px;">for</span>($i =<span class="hljs-number" style="color: rgb(209, 154, 102); line-height: 26px;">0</span>;$i < <span class="hljs-number" style="color: rgb(209, 154, 102); line-height: 26px;">5</span>;$i++) {<br/>        file_put_contents($path,time() . PHP_EOL,FILE_APPEND);<br/>        sleep(<span class="hljs-number" style="color: rgb(209, 154, 102); line-height: 26px;">1</span>);<br/>    }<br/><br/>    file_put_contents($path,<span class="hljs-string" style="color: rgb(152, 195, 121); line-height: 26px;">&#39;程序运行结束&#39;</span> . PHP_EOL,FILE_APPEND);<br/><br/>}<br/><br/><span class="hljs-comment" style="color: rgb(92, 99, 112); font-style: italic; line-height: 26px;">/**<br/> * 输出文字标记,任务开始<br/> */</span><br/><span class="hljs-keyword" style="color: rgb(198, 120, 221); line-height: 26px;">echo</span>(<span class="hljs-string" style="color: rgb(152, 195, 121); line-height: 26px;">&#39;任务开始&#39;</span>);<br/><br/><span class="hljs-comment" style="color: rgb(92, 99, 112); font-style: italic; line-height: 26px;">/**<br/> *  后台执行非常耗时的任务<br/> */</span><br/>register_shutdown_function(writeFile);<br/><br/><span class="hljs-comment" style="color: rgb(92, 99, 112); font-style: italic; line-height: 26px;">/**<br/> * 立即发送请求<br/> */</span><br/>fastcgi_finish_request();<br/><br/><br/><br/></code>

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

위의 모든 테스트는 Linux 시스템을 사용하여 수행되었습니다. 직관적인 효과를 확인하세요.

위 시연 후 응답은 매우 빠릅니다. 브라우저가 응답한 후에도 백그라운드 프로그램은 여전히 ​​매초 타임스탬프를 실행합니다.

위는 fastcgi_finish_request 방법 간단한 소개. 관심이 있으시면 간략하게 시도해 보시면 작은 비밀을 더 잘 이해할 수 있습니다. fastcgi_finish_request方法的简单介绍,如果你也感兴趣可以进行简单的尝试一下,有助于更好的去理解其中的小秘密。

三、trait特性讲解<span class="suffix"></span>

应该在俩年前咔咔就对这个特性进行过一次解析,trait

3. 특성 설명

Kaka는 이 기능을 2년 전에 분석했어야 했습니다. 특성은 종종 슈퍼 클래스라고도 합니다.

이 기능은 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 및 특성 기능

위 그림을 통해 결과에 액세스하면 Test 슈퍼 클래스 파일을 반환하는 메서드도 Controller 컨트롤러를 기반으로 한다는 것을 알 수 있습니다. . 슈퍼 클래스는 다중 상속 기능을 구현합니다.

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

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

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

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

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

오류 메시지 해결

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

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

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

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

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

솔루션 구현

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

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

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

위 그림을 보면 접근을 제어하기 위해 접근 방법이 별칭으로 변경된 것을 볼 수 있는데, 접근 결과를 살펴보겠습니다.

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

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

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

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

여기까지 컨트롤러의 소스코드 분석은 여기까지입니다. Kaka는 소스코드를 통해 컨트롤러가 어떻게 인스턴스화되는지 분석하겠습니다.

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

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

저도 소스코드에서 fastcgi_finish_request 메소드를 영리하게 사용하는 것에 대해 배웠는데, 이 함수를 사용할 때 Kaka에 대해 언급된 두 가지 사항에 주의해야 합니다.

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

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

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

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