服务容器的生命周期是多少?

Chi*_*may 3 php symfony

我正在尝试理解Symfony2框架.

来自Java/Spring背景,我意识到Symfony2中的Scope与Spring中的Scope不同.此外,使用Symfony3,不推荐使用Scope,但我们可以指定服务是否共享.

这是什么意思?

服务容器是否会保留服务对象直到其生命周期?这是否意味着我可以使用成员变量来跨请求保存有状态信息?(我不知道,如果这是真的可能的,因为显然这并没有发生).

所以它可能不会跨越请求.服务容器的生命周期是否等于请求?因为我注意到我有两个消费者使用的依赖关系,如果我设置shared: false,每个消费者获得依赖关系的不同"状态".但他们基本上是在同一个请求.

指定shared: false真正意味着什么?或者是什么shared: true意思?

Man*_*tas 6

服务的生命周期是单一请求.

共享服务意味着每次访问服务时都会返回相同的实例.如果设置,shared: false则每次请求服务时都会创建新的服务实例.

你还提到了2个消费者.我相信您将您的消费者作为独立的流程运行,因此这些是不同的请求和不同的范围.


Xat*_*too 5

尽管 Mantas 在大多数情况下是正确的,但声明生命周期是单个请求在某些边缘情况下可能会产生误导。

基本上,服务容器的生命周期与内核的生命周期一样长。服务容器Kernel::boot()在内核第一次处理请求时被调用。(例如,请参阅您的前端控制器 app.php。)Kernel::shutdown()在 PHP 进程退出时或退出时,容器将被丢弃。

因此,当您让内核处理多个请求时,或者在内核的生命周期内执行子请求时,服务容器仍然存在并且服务中的任何状态都将保留。

以下面两个代码片段为例:

$kernel = new AppKernel('prod', false);
$kernel->loadClassCache();

$responseOne = $kernel->handle($requestOne); // Container initialised
$responseOne->send();
$kernel->terminate($requestOne, $responseOne);

$responseTwo = $kernel->handle($requestTwo); // Container still exists
$responseTwo->send();
$kernel->terminate($requestTwo, $responseTwo);

$kernel->shutdown(); // Container destructed
Run Code Online (Sandbox Code Playgroud)

$kernel = new AppKernel('prod', false);
$kernel->loadClassCache();

$responseOne = $kernel->handle($requestOne); // Container initialised
$responseOne->send();
$kernel->terminate($requestOne, $responseOne);
$kernel->shutdown(); // Container destructed

$responseTwo = $kernel->handle($requestTwo); // New Container initialised
$responseTwo->send();
$kernel->terminate($requestTwo, $responseTwo);
// PHP exits, container destructed
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,您的 PHP 进程将具有对您的网络服务器的一个请求的生命周期。但是,在某些情况下,您可以利用在请求之间保持内核(包括服务容器)处于活动状态的能力。例如,有一个php-pm 项目,它基本上使您的内核保持活动状态并向它发出请求。

这将大大提高性能(没有为每个请求一遍又一遍地构建容器和初始化包的开销)。另一方面,您的服务将被多个请求共享,并且可能为多个用户共享,这意味着在您的服务中保存状态可能会带来很大的安全风险。

因此,始终将数据类与服务分开,不要在服务中存储数据。Symfony 就是一个很好的例子,它使用 Request 和 Response 类来分离数据。