생명 주기
프로세스 생명 주기
- 각 프로세스는 긴 생명 주기를 가집니다.
- 각 프로세스는 독립적으로 실행되며 서로 간섭하지 않습니다.
- 각 프로세스는 생명 주기 동안 여러 요청을 처리할 수 있습니다.
- 프로세스가
stop
,reload
,restart
명령을 수신하면 종료되어 생명 주기를 종료합니다.
팁
각 프로세스는 독립적으로 서로 간섭하지 않으므로, 각 프로세스는 자신의 리소스, 변수 및 클래스 인스턴스 등을 유지합니다. 예를 들어, 각 프로세스는 자신의 데이터베이스 연결을 가지고 있으며, 일부 싱글톤은 각 프로세스에서 한 번 초기화됩니다. 따라서 여러 프로세스가 초기화되면 여러 번 초기화됩니다.
요청 생명 주기
- 각 요청은 하나의
$request
객체를 생성합니다. $request
객체는 요청 처리가 완료된 후 회수됩니다.
컨트롤러 생명 주기
- 각 컨트롤러는 각 프로세스에서 한 번만 인스턴스화되며, 여러 프로세스에서는 여러 번 인스턴스화됩니다(컨트롤러 재사용 제외, 컨트롤러 생명 주기 참조).
- 컨트롤러 인스턴스는 현재 프로세스 내 여러 요청에서 공유됩니다(컨트롤러 재사용 제외).
- 컨트롤러 생명 주기는 프로세스가 종료된 후 종료됩니다(컨트롤러 재사용 제외).
변수 생명 주기에 대하여
webman은 PHP로 개발되었으므로, 완전히 PHP의 변수 회수 메커니즘을 따릅니다. 비즈니스 로직에서 생성된 임시 변수는 new
키워드로 생성된 클래스의 인스턴스를 포함하여 함수 또는 메서드가 끝날 때 자동으로 회수되며, 수동으로 unset
으로 해제할 필요가 없습니다. 즉, webman 개발은 전통적인 프레임워크 개발 경험과 기본적으로 일치합니다. 예를 들어, 아래 예제에서 $foo
인스턴스는 index 메서드가 완료됨과 함께 자동으로 해제됩니다:
<?php
namespace app\controller;
use app\service\Foo;
use support\Request;
class IndexController
{
public function index(Request $request)
{
$foo = new Foo(); // 여기서 Foo 클래스가 있다고 가정합니다.
return response($foo->sayHello());
}
}
어떤 클래스의 인스턴스를 재사용하고 싶다면, 클래스를 클래스의 정적 속성 또는 장기 생명 주기 객체(예: 컨트롤러)의 속성에 저장하거나 Container 컨테이너의 get
메서드를 사용하여 클래스를 초기화할 수 있습니다. 예를 들어:
<?php
namespace app\controller;
use app\service\Foo;
use support\Container;
use support\Request;
class IndexController
{
public function index(Request $request)
{
$foo = Container::get(Foo::class);
return response($foo->sayHello());
}
}
Container::get()
메서드는 클래스의 인스턴스를 생성하고 저장하는 데 사용됩니다. 다음 번에 동일한 매개변수로 다시 호출하면 이전에 생성된 클래스 인스턴스가 반환됩니다.
주의
Container::get()
은 생성자 매개변수가 없는 인스턴스만 초기화할 수 있습니다.Container::make()
는 생성자 매개변수가 있는 인스턴스를 생성할 수 있지만,Container::get()
과는 달리Container::make()
는 인스턴스를 재사용하지 않습니다. 즉, 동일한 매개변수를 사용하더라도Container::make()
는 항상 새로운 인스턴스를 반환합니다.
메모리 누수에 대하여
대부분의 경우, 우리의 비즈니스 코드에서 메모리 누수가 발생하지 않으며(사용자가 메모리 누수 발생을 보고한 경우는 극히 드물음), 우리는 긴 생명 주기의 배열 데이터가 무한히 확장되지 않도록 약간의 주의만 기울이면 됩니다. 다음 코드를 참조하십시오:
<?php
namespace app\controller;
use support\Request;
class FooController
{
// 배열 속성
public $data = [];
public function index(Request $request)
{
$this->data[] = time();
return response('hello index');
}
public function hello(Request $request)
{
return response('hello webman');
}
}
컨트롤러는 기본적으로 긴 생명 주기를 가지며(컨트롤러 재사용 제외), 동일한 컨트롤러의 $data
배열 속성도 긴 생명 주기를 가집니다. foo/index
요청이 계속 증가함에 따라 $data
배열 요소가 점점 많아져 메모리 누수가 발생할 수 있습니다.
자세한 내용은 메모리 누수를 참조하십시오.