Laravel의 라이프사이클에 대한 자세한 설명
다음은 Laravel 튜토리얼 칼럼에서 소개한 Laravel의 생명주기입니다. 필요한 친구들에게 도움이 되었으면 좋겠습니다!
Laravel의 수명주기
세상의 모든 것에는 수명주기가 있습니다. 어떤 도구를 사용하든 그 작동 원리를 이해해야 사용하기 편리합니다. 애플리케이션 개발에도 해당됩니다. 원리를 이해하고 나면 쉽게 사용할 수 있을 것입니다.
Laravel의 라이프사이클을 이해하기 전에 먼저 PHP의 라이프사이클을 살펴보겠습니다.
PHP의 수명주기
PHP의 작동 모드
PHP의 두 가지 작동 모드는 WEB 모드와 CLI 모드입니다.
- 터미널에서 php 명령어를 입력하면 CLI 모드를 사용하고 있는 것입니다.
- Nginx 또는 다른 웹 서버를 호스트로 사용하여 들어오는 요청을 처리하는 경우 WEB 모드가 사용됩니다.
라이프 사이클
php
파일을 요청하면 PHP는 요청을 완료하기 위해 5단계의 라이프 사이클 전환을 거칩니다. php
文件时,PHP 为了完成这次请求,会发生5个阶段的生命周期切换:
模块初始化(MINIT),即调用
php.ini
中指明的扩展的初始化函数进行初始化工作,如mysql
扩展。请求初始化(RINIT),即初始化为执行本次脚本所需要的变量名称和变量值内容的符号表,如
$_SESSION
变量。执行该PHP脚本。
请求处理完成(Request Shutdown),按顺序调用各个模块的
RSHUTDOWN
方法,对每个变量调用unset
函数,如unset $_SESSION
变量。关闭模块(Module Shutdown) , PHP调用每个扩展的
MSHUTDOWN
方法,这是各个模块最后一次释放内存的机会。这意味着没有下一个请求了。
WEB模式和CLI(命令行)模式很相似,区别是:
- CLI 模式会在每次脚本执行经历完整的5个周期,因为你脚本执行完不会有下一个请求;
- WEB模式为了应对并发,可能采用多线程,因此生命周期
1
和5
有可能只执行一次,下次请求到来时重复2-4
的生命周期,这样就节省了系统模块初始化所带来的开销。
可以看出Laravel의 라이프사이클에 대한 자세한 설명是很对称的。说了这么多,就是为了定位Laravel运行在哪里,没错,Laravel仅仅运行再 第三个阶段:
Laravel의 라이프사이클에 대한 자세한 설명
作用
理解这些,你就可以优化你的 Laravel
代码,可以更加深入的了解 Laravel 的singleton
(单例)。至少你知道了,每一次请求结束,PHP 的变量都会 unset
,Laravel 的 singleton
只是在某一次Laravel의 라이프사이클에 대한 자세한 설명中的singleton
;你在 Laravel 中的静态变量也不能在多个请求之间共享,因为每一次请求结束都会 unset
。理解这些概念,是写高质量代码的第一步,也是最关键的一步。因此记住,PHP是一种脚本语言,所有的变量只会在这一次请求中生效,下次请求之时已被重置,而不像Java静态变量拥有全局作用。
Laravel 的生命周期
概述
Laravel 的生命周期从publicindex.php
开始,从publicindex.php
结束。
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自动加载需要的类
文件载入composer生成的自动加载设置,包括所有你
composer require
- 모듈 초기화(MINIT) 즉,
mysql
확장과 같은 초기화 작업을 수행하기 위해php.ini
에 지정된 확장의 초기화 함수를 호출하는 것입니다. $_SESSION
변수와 같이 이 스크립트를 실행하는 데 필요한 변수 이름과 변수 값 내용으로 기호 테이블을 초기화하는 요청 초기화(RINIT)입니다. 🎜🎜PHP 스크립트를 실행합니다. 🎜🎜🎜🎜요청 처리가 완료된 후(Request Shutdown) 각 모듈의RSHUTDOWN
메서드를 순서대로 호출하고, 다음과 같은 각 변수에 대해unset
함수를 호출합니다.$_SESSION
변수를 설정 해제합니다. 🎜🎜🎜🎜모듈 종료, PHP는 각 확장의MSHUTDOWN
메서드를 호출합니다. 이는 각 모듈이 메모리를 해제할 수 있는 마지막 기회입니다. 이는 다음 요청이 없음을 의미합니다. 🎜🎜🎜🎜WEB 모드는 CLI(명령줄) 모드와 매우 유사하지만 차이점은 다음과 같습니다. 🎜🎜🎜CLI 모드는 스크립트가 실행될 때마다 완전한 5주기를 거칩니다. 스크립트 후에는 다음 요청이 없기 때문입니다. 🎜 🎜WEB 모드는 동시성에 대처하기 위해 멀티스레딩을 사용할 수 있으므로 라이프 사이클1
및5
는 한 번만 실행될 수 있으며2-4는 다음에 요청이 들어올 때
의 수명 주기를 반복하므로 시스템 모듈 초기화로 인한 오버헤드가 절약됩니다. 🎜🎜🎜PHP 수명주기가 매우 대칭임을 알 수 있습니다. 이 모든 것은 Laravel이 실행되는 위치를 찾는 것입니다. 예, Laravel은 세 번째 단계에서만 실행됩니다: 🎜🎜🎜
PHP 수명 주기 🎜🎜🎜Function🎜🎜🎜이를 이해하면
Laravel</code을 최적화할 수 있습니다. > 코드를 통해 Laravel의 <code>싱글톤
(단일 사례)에 대해 더 깊이 이해할 수 있습니다. 최소한 모든 요청 후에 PHP의 변수는설정 해제
되고 Laravel의싱글톤
은 특정 요청 중에만싱글톤
이라는 것을 알고 있습니다. Laravel에서는 각 요청이 끝날 때설정 해제
되기 때문에 여러 요청에서 공유할 수 없습니다. 이러한 개념을 이해하는 것은 고품질 코드를 작성하는 첫 번째이자 가장 중요한 단계입니다. 따라서 PHP는 스크립팅 언어이며 모든 변수는 전역적으로 영향을 미치는 Java 정적 변수와는 달리 이 요청에서만 적용되며 다음 요청에서 재설정됩니다. 🎜🎜🎜Laravel의 라이프 사이클🎜🎜🎜🎜Overview🎜🎜🎜Laravel의 라이프 사이클은publicindex.php
에서 시작하여publicindex.php
로 끝납니다. 🎜🎜🎜
요청 프로세스 🎜🎜다음은
publicindex.php
의 전체 소스 코드이며, 보다 구체적으로 4단계로 나눌 수 있습니다. 🎜🎜다음은 4단계에 대한 자세한 설명입니다. 🎜composer 필요한 클래스를 자동으로 로드합니다🎜 🎜🎜🎜이 파일은 모든protected $bootstrappers = [ //注册系统环境配置 (.env) 'Illuminate\Foundation\Bootstrap\DetectEnvironment', //注册系统配置(config) 'Illuminate\Foundation\Bootstrap\LoadConfiguration', //注册日志配置 'Illuminate\Foundation\Bootstrap\ConfigureLogging', //注册异常处理 'Illuminate\Foundation\Bootstrap\HandleExceptions', //注册服务容器的门面,Facade 是个提供从容器访问对象的类。 'Illuminate\Foundation\Bootstrap\RegisterFacades', //注册服务提供者 'Illuminate\Foundation\Bootstrap\RegisterProviders', //注册服务提供者 `boot` 'Illuminate\Foundation\Bootstrap\BootProviders', ];
로그인 후 복사로그인 후 복사composer require
종속성을 포함하여 작곡가가 생성한 자동 로드 설정을 로드합니다. 🎜🎜🎜🎜 컨테이너 컨테이너, 애플리케이션 인스턴스를 생성하고 컨테이너에 핵심 구성 요소(HttpKernel, ConsoleKernel, ExceptionHandler)를 등록합니다(코드 2에 해당, 컨테이너는 매우 중요하며 나중에 자세히 설명합니다). 🎜🎜🎜🎜요청을 처리하고, 응답을 생성하고 보냅니다(코드 3에 해당, 코드의 99%가 이 작은 핸들 방식에서 실행된다고 해도 과언이 아닙니다). 🎜请求结束,进行回调(对应代码4,还记得可终止中间件吗?没错,就是在这里回调的)。
Laravel 的请求步骤
我们不妨在详细一点:
第一步:注册加载composer自动生成的class loader
就是加载初始化第三方依赖。
第二步:生成容器 Container
并向容器注册核心组件,是从 bootstrap/app.php
脚本获取 Laravel 应用实例,
第三步:这一步是重点,处理请求,并生成发送响应。
请求被发送到 HTTP
内核或 Console
内核,这取决于进入应用的请求类型。
取决于是通过浏览器请求还是通过控制台请求。这里我们主要是通过浏览器请求。
HTTP 内核继承自 Illuminate\Foundation\Http\Kernel 类,该类定义了一个 bootstrappers 数组,这个数组中的类在请求被执行前运行,这些 bootstrappers 配置了错误处理、日志、检测应用环境以及其它在请求被处理前需要执行的任务。
protected $bootstrappers = [ //注册系统环境配置 (.env) 'Illuminate\Foundation\Bootstrap\DetectEnvironment', //注册系统配置(config) 'Illuminate\Foundation\Bootstrap\LoadConfiguration', //注册日志配置 'Illuminate\Foundation\Bootstrap\ConfigureLogging', //注册异常处理 'Illuminate\Foundation\Bootstrap\HandleExceptions', //注册服务容器的门面,Facade 是个提供从容器访问对象的类。 'Illuminate\Foundation\Bootstrap\RegisterFacades', //注册服务提供者 'Illuminate\Foundation\Bootstrap\RegisterProviders', //注册服务提供者 `boot` 'Illuminate\Foundation\Bootstrap\BootProviders', ];
注意顺序:
Facades
先于ServiceProviders
,Facades
也是重点,后面说,这里简单提一下,注册Facades
就是注册config\app.php
中的aliases
数组,你使用的很多类,如Auth
,Cache
,DB
等等都是Facades
;而ServiceProviders
的register
方法永远先于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의 라이프사이클에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

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

뜨거운 주제









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

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

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

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

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

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

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

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