목차
第一步:注册加载composer自动生成的class loader
第二步:生成容器 Container
第三步:这一步是重点,处理请求,并生成发送响应。
第四步:将请求传递给路由。
PHP 프레임워크 Laravel Laravel의 라이프사이클에 대한 자세한 설명

Laravel의 라이프사이클에 대한 자세한 설명

Jul 27, 2020 pm 01:20 PM
laravel

다음은 Laravel 튜토리얼 칼럼에서 소개한 Laravel의 생명주기입니다. 필요한 친구들에게 도움이 되었으면 좋겠습니다!

Laravel의 라이프사이클에 대한 자세한 설명

Laravel의 수명주기

세상의 모든 것에는 수명주기가 있습니다. 어떤 도구를 사용하든 그 작동 원리를 이해해야 사용하기 편리합니다. 애플리케이션 개발에도 해당됩니다. 원리를 이해하고 나면 쉽게 사용할 수 있을 것입니다.
Laravel의 라이프사이클을 이해하기 전에 먼저 PHP의 라이프사이클을 살펴보겠습니다.

PHP의 수명주기

PHP의 작동 모드

PHP의 두 가지 작동 모드는 WEB 모드와 CLI 모드입니다.

  1. 터미널에서 php 명령어를 입력하면 CLI 모드를 사용하고 있는 것입니다.
  2. Nginx 또는 다른 웹 서버를 호스트로 사용하여 들어오는 요청을 처리하는 경우 WEB 모드가 사용됩니다.

라이프 사이클

php 파일을 요청하면 PHP는 요청을 완료하기 위해 5단계의 라이프 사이클 전환을 거칩니다. php文件时,PHP 为了完成这次请求,会发生5个阶段的生命周期切换:

  1. 模块初始化(MINIT),即调用 php.ini 中指明的扩展的初始化函数进行初始化工作,如 mysql 扩展。

  2. 请求初始化(RINIT),即初始化为执行本次脚本所需要的变量名称和变量值内容的符号表,如 $_SESSION变量。

  3. 执行该PHP脚本。

  4. 请求处理完成(Request Shutdown),按顺序调用各个模块的 RSHUTDOWN 方法,对每个变量调用 unset函数,如 unset $_SESSION 变量。

  5. 关闭模块(Module Shutdown) , PHP调用每个扩展的 MSHUTDOWN 方法,这是各个模块最后一次释放内存的机会。这意味着没有下一个请求了。

WEB模式和CLI(命令行)模式很相似,区别是:

  1. CLI 模式会在每次脚本执行经历完整的5个周期,因为你脚本执行完不会有下一个请求;
  2. WEB模式为了应对并发,可能采用多线程,因此生命周期15有可能只执行一次,下次请求到来时重复2-4的生命周期,这样就节省了系统模块初始化所带来的开销。

可以看出Laravel의 라이프사이클에 대한 자세한 설명是很对称的。说了这么多,就是为了定位Laravel运行在哪里,没错,Laravel仅仅运行再 第三个阶段:

Laravel의 라이프사이클에 대한 자세한 설명

Laravel의 라이프사이클에 대한 자세한 설명

作用

理解这些,你就可以优化你的 Laravel 代码,可以更加深入的了解 Laravel 的singleton(单例)。至少你知道了,每一次请求结束,PHP 的变量都会 unset,Laravel 的 singleton 只是在某一次Laravel의 라이프사이클에 대한 자세한 설명中的singleton;你在 Laravel 中的静态变量也不能在多个请求之间共享,因为每一次请求结束都会 unset。理解这些概念,是写高质量代码的第一步,也是最关键的一步。因此记住,PHP是一种脚本语言,所有的变量只会在这一次请求中生效,下次请求之时已被重置,而不像Java静态变量拥有全局作用。

Laravel 的生命周期

概述

Laravel 的生命周期从publicindex.php开始,从publicindex.php结束。

Laravel의 라이프사이클에 대한 자세한 설명

Laravel의 라이프사이클에 대한 자세한 설명

下面是 publicindex.php的全部源码,更具体来说可以分为四步:

1. require __DIR__.'/../bootstrap/autoload.php';

2. $app = require_once __DIR__.'/../bootstrap/app.php';
   $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

3. $response = $kernel->handle(
      $request = Illuminate\Http\Request::capture()
   );
   $response->send();

4. $kernel->terminate($request, $response);
로그인 후 복사

以下是四步详细的解释是:
composer自动加载需要的类

  1. 文件载入composer生成的自动加载设置,包括所有你 composer require

  2. 모듈 초기화(MINIT) 즉, mysql 확장과 같은 초기화 작업을 수행하기 위해 php.ini에 지정된 확장의 초기화 함수를 호출하는 것입니다.

  3. $_SESSION 변수와 같이 이 스크립트를 실행하는 데 필요한 변수 이름과 변수 값 내용으로 기호 테이블을 초기화하는 요청 초기화(RINIT)입니다.

    🎜🎜PHP 스크립트를 실행합니다. 🎜🎜🎜🎜요청 처리가 완료된 후(Request Shutdown) 각 모듈의 RSHUTDOWN 메서드를 순서대로 호출하고, 다음과 같은 각 변수에 대해 unset 함수를 호출합니다. $_SESSION 변수를 설정 해제합니다. 🎜🎜🎜🎜모듈 종료, PHP는 각 확장의 MSHUTDOWN 메서드를 호출합니다. 이는 각 모듈이 메모리를 해제할 수 있는 마지막 기회입니다. 이는 다음 요청이 없음을 의미합니다. 🎜🎜🎜🎜WEB 모드는 CLI(명령줄) 모드와 매우 유사하지만 차이점은 다음과 같습니다. 🎜🎜🎜CLI 모드는 스크립트가 실행될 때마다 완전한 5주기를 거칩니다. 스크립트 후에는 다음 요청이 없기 때문입니다. 🎜 🎜WEB 모드는 동시성에 대처하기 위해 멀티스레딩을 사용할 수 있으므로 라이프 사이클 15는 한 번만 실행될 수 있으며 2-4는 다음에 요청이 들어올 때 의 수명 주기를 반복하므로 시스템 모듈 초기화로 인한 오버헤드가 절약됩니다. 🎜🎜🎜PHP 수명주기가 매우 대칭임을 알 수 있습니다. 이 모든 것은 Laravel이 실행되는 위치를 찾는 것입니다. 예, Laravel은 세 번째 단계에서만 실행됩니다: 🎜

    PHP 수명주기🎜🎜

    PHP 수명 주기 🎜🎜🎜Function🎜🎜🎜이를 이해하면 Laravel</code을 최적화할 수 있습니다. > 코드를 통해 Laravel의 <code>싱글톤(단일 사례)에 대해 더 깊이 이해할 수 있습니다. 최소한 모든 요청 후에 PHP의 변수는 설정 해제되고 Laravel의 싱글톤은 특정 요청 중에만 싱글톤이라는 것을 알고 있습니다. Laravel에서는 각 요청이 끝날 때 설정 해제되기 때문에 여러 요청에서 공유할 수 없습니다. 이러한 개념을 이해하는 것은 고품질 코드를 작성하는 첫 번째이자 가장 중요한 단계입니다. 따라서 PHP는 스크립팅 언어이며 모든 변수는 전역적으로 영향을 미치는 Java 정적 변수와는 달리 이 요청에서만 적용되며 다음 요청에서 재설정됩니다. 🎜🎜🎜Laravel의 라이프 사이클🎜🎜🎜🎜Overview🎜🎜🎜Laravel의 라이프 사이클은 publicindex.php에서 시작하여 publicindex.php로 끝납니다. 🎜

    요청 프로세스🎜🎜

    요청 프로세스 🎜🎜다음은 publicindex.php의 전체 소스 코드이며, 보다 구체적으로 4단계로 나눌 수 있습니다. 🎜

    protected $bootstrappers = [
            //注册系统环境配置 (.env)
            &#39;Illuminate\Foundation\Bootstrap\DetectEnvironment&#39;,
            //注册系统配置(config)
            &#39;Illuminate\Foundation\Bootstrap\LoadConfiguration&#39;,
            //注册日志配置
            &#39;Illuminate\Foundation\Bootstrap\ConfigureLogging&#39;,
            //注册异常处理
            &#39;Illuminate\Foundation\Bootstrap\HandleExceptions&#39;,
            //注册服务容器的门面,Facade 是个提供从容器访问对象的类。
            &#39;Illuminate\Foundation\Bootstrap\RegisterFacades&#39;,
            //注册服务提供者
            &#39;Illuminate\Foundation\Bootstrap\RegisterProviders&#39;,
            //注册服务提供者 `boot`
            &#39;Illuminate\Foundation\Bootstrap\BootProviders&#39;,
        ];
    로그인 후 복사
    로그인 후 복사
    🎜다음은 4단계에 대한 자세한 설명입니다. 🎜composer 필요한 클래스를 자동으로 로드합니다🎜 🎜🎜🎜이 파일은 모든 composer require 종속성을 포함하여 작곡가가 생성한 자동 로드 설정을 로드합니다. 🎜🎜🎜🎜 컨테이너 컨테이너, 애플리케이션 인스턴스를 생성하고 컨테이너에 핵심 구성 요소(HttpKernel, ConsoleKernel, ExceptionHandler)를 등록합니다(코드 2에 해당, 컨테이너는 매우 중요하며 나중에 자세히 설명합니다). 🎜🎜🎜🎜요청을 처리하고, 응답을 생성하고 보냅니다(코드 3에 해당, 코드의 99%가 이 작은 핸들 방식에서 실행된다고 해도 과언이 아닙니다). 🎜
  4. 请求结束,进行回调(对应代码4,还记得可终止中间件吗?没错,就是在这里回调的)。

Laravel 的请求步骤

Laravel 的请求步骤

我们不妨在详细一点:

第一步:注册加载composer自动生成的class loader

就是加载初始化第三方依赖。

第二步:生成容器 Container

并向容器注册核心组件,是从 bootstrap/app.php 脚本获取 Laravel 应用实例,

第三步:这一步是重点,处理请求,并生成发送响应。

请求被发送到 HTTP 内核或 Console 内核,这取决于进入应用的请求类型。

取决于是通过浏览器请求还是通过控制台请求。这里我们主要是通过浏览器请求。

HTTP 内核继承自 Illuminate\Foundation\Http\Kernel 类,该类定义了一个 bootstrappers 数组,这个数组中的类在请求被执行前运行,这些 bootstrappers 配置了错误处理、日志、检测应用环境以及其它在请求被处理前需要执行的任务。

protected $bootstrappers = [
        //注册系统环境配置 (.env)
        &#39;Illuminate\Foundation\Bootstrap\DetectEnvironment&#39;,
        //注册系统配置(config)
        &#39;Illuminate\Foundation\Bootstrap\LoadConfiguration&#39;,
        //注册日志配置
        &#39;Illuminate\Foundation\Bootstrap\ConfigureLogging&#39;,
        //注册异常处理
        &#39;Illuminate\Foundation\Bootstrap\HandleExceptions&#39;,
        //注册服务容器的门面,Facade 是个提供从容器访问对象的类。
        &#39;Illuminate\Foundation\Bootstrap\RegisterFacades&#39;,
        //注册服务提供者
        &#39;Illuminate\Foundation\Bootstrap\RegisterProviders&#39;,
        //注册服务提供者 `boot`
        &#39;Illuminate\Foundation\Bootstrap\BootProviders&#39;,
    ];
로그인 후 복사
로그인 후 복사

注意顺序:
Facades 先于ServiceProvidersFacades也是重点,后面说,这里简单提一下,注册 Facades 就是注册 config\app.php中的aliases 数组,你使用的很多类,如AuthCache,DB等等都是Facades;而ServiceProvidersregister方法永远先于boot方法执行,以免产生boot方法依赖某个实例而该实例还未注册的现象。

HTTP 内核还定义了一系列所有请求在处理前需要经过的 HTTP 中间件,这些中间件处理 HTTP 会话的读写、判断应用是否处于维护模式、验证 CSRF 令牌等等。

HTTP 内核的标志性方法 handle处理的逻辑相当简单:获取一个 Request,返回一个 Response,把该内核想象作一个代表整个应用的大黑盒子,输入 HTTP 请求,返回 HTTP 响应。

第四步:将请求传递给路由。

在Laravel基础的服务启动之后,就要把请求传递给路由了。路由器将会分发请求到路由或控制器,同时运行所有路由指定的中间件。

传递给路由是通过 Pipeline(管道)来传递的,但是Pipeline有一堵墙,在传递给路由之前所有请求都要经过,这堵墙定义在app\Http\Kernel.php中的$middleware数组中,没错就是中间件,默认只有一个CheckForMaintenanceMode中间件,用来检测你的网站是否暂时关闭。这是一个全局中间件,所有请求都要经过,你也可以添加自己的全局中间件。

 

然后遍历所有注册的路由,找到最先符合的第一个路由,经过它的路由中间件,进入到控制器或者闭包函数,执行你的具体逻辑代码。

所以,当请求到达你写的代码之前,Laravel已经做了大量工作,请求也经过了千难万险,那些不符合或者恶意的的请求已被Laravel隔离在外。

Laravel의 라이프사이클에 대한 자세한 설명

Laravel의 라이프사이클에 대한 자세한 설명

위 내용은 Laravel의 라이프사이클에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

PHP에서 ORM(객체 관계형 매핑)을 사용하여 데이터베이스 작업을 단순화하는 방법은 무엇입니까? PHP에서 ORM(객체 관계형 매핑)을 사용하여 데이터베이스 작업을 단순화하는 방법은 무엇입니까? May 07, 2024 am 08:39 AM

PHP의 데이터베이스 작업은 객체를 관계형 데이터베이스에 매핑하는 ORM을 사용하여 단순화됩니다. Laravel의 EloquentORM을 사용하면 객체 지향 구문을 사용하여 데이터베이스와 상호 작용할 수 있습니다. 모델 클래스를 정의하거나 Eloquent 메소드를 사용하거나 실제로 블로그 시스템을 구축하여 ORM을 사용할 수 있습니다.

PHP 단위 테스트 도구의 장점과 단점 분석 PHP 단위 테스트 도구의 장점과 단점 분석 May 06, 2024 pm 10:51 PM

PHP 단위 테스트 도구 분석: PHPUnit: 대규모 프로젝트에 적합하고 포괄적인 기능을 제공하며 설치가 쉽지만 장황하고 느릴 수 있습니다. PHPUnitWrapper: 소규모 프로젝트에 적합하고 사용하기 쉽고 Lumen/Laravel에 최적화되어 있지만 기능이 제한적이고 코드 적용 범위 분석을 제공하지 않으며 커뮤니티 지원이 제한되어 있습니다.

Laravel과 CodeIgniter의 최신 버전 비교 Laravel과 CodeIgniter의 최신 버전 비교 Jun 05, 2024 pm 05:29 PM

Laravel 9 및 CodeIgniter 4의 최신 버전은 업데이트된 기능과 개선 사항을 제공합니다. Laravel9은 MVC 아키텍처를 채택하여 데이터베이스 마이그레이션, 인증, 템플릿 엔진 등의 기능을 제공합니다. CodeIgniter4는 HMVC 아키텍처를 사용하여 라우팅, ORM 및 캐싱을 제공합니다. 성능면에서는 Laravel9의 서비스 제공자 기반 디자인 패턴과 CodeIgniter4의 경량 프레임워크가 뛰어난 성능을 제공합니다. 실제 애플리케이션에서 Laravel9은 유연성과 강력한 기능이 필요한 복잡한 프로젝트에 적합한 반면, CodeIgniter4는 빠른 개발 및 소규모 애플리케이션에 적합합니다.

Laravel - 장인 명령 Laravel - 장인 명령 Aug 27, 2024 am 10:51 AM

Laravel - Artisan Commands - Laravel 5.7은 새로운 명령을 처리하고 테스트하는 새로운 방법을 제공합니다. 여기에는 장인 명령을 테스트하는 새로운 기능이 포함되어 있으며 데모는 아래에 언급되어 있습니다.

Laravel과 CodeIgniter의 데이터 처리 기능은 어떻게 비교됩니까? Laravel과 CodeIgniter의 데이터 처리 기능은 어떻게 비교됩니까? Jun 01, 2024 pm 01:34 PM

Laravel과 CodeIgniter의 데이터 처리 기능을 비교해 보세요. ORM: Laravel은 클래스-객체 관계형 매핑을 제공하는 EloquentORM을 사용하는 반면, CodeIgniter는 데이터베이스 모델을 PHP 클래스의 하위 클래스로 표현하기 위해 ActiveRecord를 사용합니다. 쿼리 빌더: Laravel에는 유연한 체인 쿼리 API가 있는 반면, CodeIgniter의 쿼리 빌더는 더 간단하고 배열 기반입니다. 데이터 검증: Laravel은 사용자 정의 검증 규칙을 지원하는 Validator 클래스를 제공하는 반면, CodeIgniter는 내장된 검증 기능이 적고 사용자 정의 규칙을 수동으로 코딩해야 합니다. 실제 사례: 사용자 등록 예시에서는 Lar를 보여줍니다.

Laravel과 CodeIgniter: 대규모 프로젝트에는 어떤 프레임워크가 더 좋나요? Laravel과 CodeIgniter: 대규모 프로젝트에는 어떤 프레임워크가 더 좋나요? Jun 04, 2024 am 09:09 AM

대규모 프로젝트를 위한 프레임워크를 선택할 때 Laravel과 CodeIgniter는 각각 고유한 장점을 가지고 있습니다. Laravel은 엔터프라이즈급 애플리케이션을 위해 설계되었으며 모듈식 디자인, 종속성 주입 및 강력한 기능 세트를 제공합니다. CodeIgniter는 속도와 사용 편의성을 강조하여 중소 규모 프로젝트에 더 적합한 경량 프레임워크입니다. 요구 사항이 복잡하고 사용자 수가 많은 대규모 프로젝트의 경우 Laravel의 성능과 확장성이 더 적합합니다. 간단한 프로젝트나 리소스가 제한된 상황에서는 CodeIgniter의 가볍고 빠른 개발 기능이 더 이상적입니다.

Laravel과 CodeIgniter 중 어느 것이 더 초보자에게 적합합니까? Laravel과 CodeIgniter 중 어느 것이 더 초보자에게 적합합니까? Jun 05, 2024 pm 07:50 PM

초보자의 경우 CodeIgniter는 학습 곡선이 더 완만하고 기능이 적지만 기본적인 요구 사항을 충족합니다. Laravel은 더 넓은 기능 세트를 제공하지만 학습 곡선이 약간 더 가파릅니다. 성능면에서는 Laravel과 CodeIgniter 모두 좋은 성능을 보입니다. Laravel은 보다 광범위한 문서와 적극적인 커뮤니티 지원을 제공하는 반면 CodeIgniter는 더 간단하고 가벼우며 강력한 보안 기능을 갖추고 있습니다. 블로그 애플리케이션을 구축하는 실제 사례에서 Laravel의 EloquentORM은 데이터 조작을 단순화하는 반면 CodeIgniter는 더 많은 수동 구성이 필요합니다.

PHP 코드 단위 테스트 및 통합 테스트 PHP 코드 단위 테스트 및 통합 테스트 May 07, 2024 am 08:00 AM

PHP 단위 및 통합 테스트 가이드 단위 테스트: 단일 코드 또는 함수 단위에 중점을 두고 PHPUnit을 사용하여 검증용 테스트 케이스 클래스를 만듭니다. 통합 테스트: 여러 코드 단위가 함께 작동하는 방식에 주의를 기울이고 PHPUnit의 setUp() 및 TearDown() 메서드를 사용하여 테스트 환경을 설정하고 정리합니다. 실제 사례: PHPUnit을 사용하여 데이터베이스 생성, 서버 시작 및 테스트 코드 작성을 포함하여 Laravel 애플리케이션에서 단위 및 통합 테스트를 수행합니다.

See all articles