Хотя в большинстве случаев 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.
Когда вы говорите >> «Общая служба означает, что тот же экземпляр будет возвращаться каждый раз, когда к нему обращаются», вы имеете в виду в том же запросе, потому что они, как я понимаю часть одного и того же контейнера службы? По 2 потребителя я имел в виду 1 - контроллер, который напрямую обращается к методу зависимости D1, а также обращается к D1 через D2. Я заметил, что оба были разными состояниями, когда 'shared' был' false'. Но такое же состояние, когда 'shared' было' true'. – Chinmay
Да, я имею в виду «в том же запросе». Symfony не имеет ничего общего между запросами (за исключением случаев, когда явное хранение в файлах cookie, сеансах, некоторой базе данных или любом другом хранилище). – Mantas
Увидев мои испытания и ваш ответ, я отвечу, как принято. Спасибо. У меня есть другой вопрос - если мы можем указать службу как общую, используя аннотации. Но я думаю, это требует другого вопроса. – Chinmay