2015-11-23 4 views
3

Я пытаюсь понять рамки Symfony2.Какова продолжительность обслуживания контейнера обслуживания?

Исходя из фона Java/Spring, я понял, что Scope в Symfony2 отличается от Scope весной. Кроме того, с Symfony3, Scope is deprecated, но мы можем указать, является ли служба общей или нет.

Что это значит?

Сохраняется ли сервисный объект в сервисном контейнере до его срока службы? Означает ли это, что я могу использовать переменные-члены для хранения информации о состоянии через запросы? (Я не уверен, что это действительно возможно, потому что, видимо, это делает не).

Таким образом, это, вероятно, не распространяется на запросы. Соответствует ли срок службы контейнера запросу? Поскольку я замечаю, что у меня есть зависимость, используемая двумя потребителями, если я устанавливаю shared: false, каждый потребитель получает другое «состояние» зависимости. Но они по сути по той же просьбе.

Что конкретно означает shared: false? Или что означает shared: true?

ответ

5

Срок службы для одного запроса.

Общая служба означает, что тот же экземпляр будет возвращаться каждый раз при обращении к сервису. Если вы установили shared: false, то новый экземпляр службы будет создан каждый раз, когда вы запрашиваете услугу.

Вы упомянули 2 потребителя. Я считаю, что вы запускаете своих потребителей в виде отдельных процессов, так что это разные запросы и разные области.

+0

Когда вы говорите >> «Общая служба означает, что тот же экземпляр будет возвращаться каждый раз, когда к нему обращаются», вы имеете в виду в том же запросе, потому что они, как я понимаю часть одного и того же контейнера службы? По 2 потребителя я имел в виду 1 - контроллер, который напрямую обращается к методу зависимости D1, а также обращается к D1 через D2. Я заметил, что оба были разными состояниями, когда 'shared' был' false'. Но такое же состояние, когда 'shared' было' true'. – Chinmay

+0

Да, я имею в виду «в том же запросе». Symfony не имеет ничего общего между запросами (за исключением случаев, когда явное хранение в файлах cookie, сеансах, некоторой базе данных или любом другом хранилище). – Mantas

+0

Увидев мои испытания и ваш ответ, я отвечу, как принято. Спасибо. У меня есть другой вопрос - если мы можем указать службу как общую, используя аннотации. Но я думаю, это требует другого вопроса. – Chinmay

3

Хотя в большинстве случаев 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 

И

$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 

В большинстве случаев ваши PHP процес будет иметь срок службы одного запроса к вашему веб-серверу. Однако есть ситуации, когда вы можете использовать возможность поддерживать ядро, включая контейнер службы, между запросами. Например, есть php-pm project, который в основном поддерживает ваше ядро ​​и вызывает на нем запросы.

Это позволит улучшить производительность (нет накладных расходов на сборку контейнера и инициализацию пакетов снова и снова для каждого запроса). С другой стороны, ваши услуги будут использоваться для нескольких запросов и, вероятно, для нескольких пользователей, что означает, что сохранение состояния в ваших службах может нанести большой риск для безопасности.

Поэтому всегда разделяйте свои классы данных из своих служб и не храните данные в своих службах. Symfony - хороший пример, он отделяет данные, используя классы Request and Response.

Смежные вопросы