8000 Merge branch '6.1' into 6.2 · symfony/symfony-docs@9f55837 · GitHub
[go: up one dir, main page]

Skip to content

Commit 9f55837

Browse files
committed
Merge branch '6.1' into 6.2
* 6.1: Update ci.yaml Add documentation of Supervisor BACKOFF strategy Messenger process managers Updated SymfonyCloud link Proper line numbers on Doctrine Persisting example Changing `monolog.logger` to `logger` Remove obsolete warning
2 parents 1cbe327 + 5404ee4 commit 9f55837

File tree

6 files changed

+133
-26
lines changed

6 files changed

+133
-26
lines changed

.github/workflows/ci.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ on:
88
branches-ignore:
99
- 'github-comments'
1010

11+
permissions:
12+
contents: read
13+
1114
jobs:
1215
symfony-docs-builder-build:
1316
name: Build (symfony-tools/docs-builder)

components/config/resources.rst

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,6 @@
44
Loading Resources
55
=================
66

7-
.. caution::
8-
9-
The ``IniFileLoader`` parses the file contents using the
10-
:phpfunction:`parse_ini_file` function. Therefore, you can only set
11-
parameters to string values. To set parameters to other data types
12-
(e.g. boolean, integer, etc), the other loaders are recommended.
13-
147
Loaders populate the application's configuration from different sources
158
like YAML files. The Config component defines the interface for such
169
loaders. The :doc:`Dependency Injection </components/dependency_injection>`

configuration.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1115,4 +1115,4 @@ And all the other topics related to configuration:
11151115
.. _`Learn the XML syntax`: https://en.wikipedia.org/wiki/XML
11161116
.. _`environment variables`: https://en.wikipedia.org/wiki/Environment_variable
11171117
.. _`symbolic links`: https://en.wikipedia.org/wiki/Symbolic_link
1118-
.. _`utilities to manage env vars`: https://symfony.com/doc/master/cloud/cookbooks/env.html
1118+
.. _`utilities to manage env vars`: https://symfony.com/doc/current/cloud/env.html

doctrine.rst

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -394,21 +394,21 @@ Take a look at the previous example in more detail:
394394

395395
.. _doctrine-entity-manager:
396396

397-
* **line 14** The ``ManagerRegistry $doctrine`` argument tells Symfony to
397+
* **line 13** The ``ManagerRegistry $doctrine`` argument tells Symfony to
398398
:ref:`inject the Doctrine service <services-constructor-injection>` into the
399399
controller method.
400400

401-
* **line 16** The ``$doctrine->getManager()`` method gets Doctrine's
401+
* **line 15** The ``$doctrine->getManager()`` method gets Doctrine's
402402
*entity manager* object, which is the most important object in Doctrine. It's
403403
responsible for saving objects to, and fetching objects from, the database.
404404

405-
* **lines 18-21** In this section, you instantiate and work with the ``$product``
405+
* **lines 17-20** In this section, you instantiate and work with the ``$product``
406406
object like any other normal PHP object.
407407

408-
* **line 24** The ``persist($product)`` call tells Doctrine to "manage" the
408+
* **line 23** The ``persist($product)`` call tells Doctrine to "manage" the
409409
``$product`` object. This does **not** cause a query to be made to the database.
410410

411-
* **line 27** When the ``flush()`` method is called, Doctrine looks through
411+
* **line 26** When the ``flush()`` method is called, Doctrine looks through
412412
all of the objects that it's managing to see if they need to be persisted
413413
to the database. In this example, the ``$product`` object's data doesn't
414414
exist in the database, so the entity manager executes an ``INSERT`` query,

messenger.rst

Lines changed: 112 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -486,23 +486,30 @@ Deploying to Production
486486

487487
On production, there are a few important things to think about:
488488

489-
**Use Supervisor to keep your worker(s) running**
489+
**Use a Process Manager like Supervisor or systemd to keep your worker(s) running**
490490
You'll want one or more "workers" running at all times. To do that, use a
491-
process control system like :ref:`Supervisor <messenger-supervisor>`.
491+
process control system like :ref:`Supervisor <messenger-supervisor>`
492+
or :ref:`systemd <messenger-systemd>`.
492493

493494
**Don't Let Workers Run Forever**
494495
Some services (like Doctrine's ``EntityManager``) will consume more memory
495496
over time. So, instead of allowing your worker to run forever, use a flag
496497
like ``messenger:consume --limit=10`` to tell your worker to only handle 10
497-
messages before exiting (then Supervisor will create a new process). There
498+
messages before exiting (then the process manager will create a new process). There
498499
are also other options like ``--memory-limit=128M`` and ``--time-limit=3600``.
499500

501+
**Stopping Workers That Encounter Errors**
502+
If a worker dependency like your database server is down, or timeout is reached,
503+
you can try to add :ref:`reconnect logic <middleware-doctrine>`, or just quit
504+
the worker if it receives too many errors with the ``--failure-limit`` option of
505+
the ``messenger:consume`` command.
506+
500507
**Restart Workers on Deploy**
501508
Each time you deploy, you'll need to restart all your worker processes so
502509
that they see the newly deployed code. To do this, run ``messenger:stop-workers``
503510
on deployment. This will signal to each worker that it should finish the message
504-
it's currently handling and should shut down gracefully. Then, Supervisor will create
505-
new worker processes. The command uses the :ref:`app <cache-configuration-with-frameworkbundle>`
511+
it's currently handling and should shut down gracefully. Then, the process manager
512+
will create new worker processes. The command uses the :ref:`app <cache-configuration-with-frameworkbundle>`
506513
cache internally - so make sure this is configured to use an adapter you like.
507514

508515
**Use the Same Cache Between Deploys**
@@ -665,11 +672,25 @@ times:
665672
startsecs=0
666673
autostart=true
667674
autorestart=true
675+
startretries=10
668676
process_name=%(program_name)s_%(process_num)02d
669677
670678
Change the ``async`` argument to use the name of your transport (or transports)
671679
and ``user`` to the Unix user on your server.
672680

681+
.. caution::
682+
683+
During a deployment, something might be unavailable (e.g. the
684+
database) causing the consumer to fail to start. In this situation,
685+
Supervisor will try ``startretries`` number of times to restart the
686+
command. Make sure to change this setting to avoid getting the command
687+
in a FATAL state, which will never restart again.
688+
689+
Each restart, Supervisor increases the delay by 1 second. For instance, if
690+
the value is ``10``, it will wait 1 sec, 2 sec, 3 sec, etc. This gives the
691+
service a total of 55 seconds to become available again. Increase the
692+
``startretries`` setting to cover the maximum expected downtime.
693+
673694
If you use the Redis Transport, note that each worker needs a unique consumer
674695
name to avoid the same message being handled by multiple workers. One way to
675696
achieve this is to set an environment variable in the Supervisor configuration
@@ -692,7 +713,7 @@ Next, tell Supervisor to read your config and start your workers:
692713
See the `Supervisor docs`_ for more details.
693714

694715
Graceful Shutdown
695-
~~~~~~~~~~~~~~~~~
716+
.................
696717

697718
If you install the `PCNTL`_ PHP extension in your project, workers will handle
698719
the ``SIGTERM`` POSIX signal to finish processing their current message before
@@ -708,6 +729,88 @@ of the desired grace period in seconds) in order to perform a graceful shutdown:
708729
[program:x]
709730
stopwaitsecs=20
710731
732+
.. _messenger-systemd:
733+
734+
Systemd Configuration
735+
~~~~~~~~~~~~~~~~~~~~~
736+
737+
While Supervisor is a great tool, it has the disadvantage that you need system
738+
access to run it. Systemd has become the standard on most Linux distributions,
739+
and has a good alternative called *user services*.
740+
741+
Systemd user service configuration files typically live in a ``~/.config/systemd/user``
742+
directory. For example, you can create a new ``messenger-worker.service`` file. Or a
743+
``messenger-worker@.service`` file if you want more instances running at the same time:
744+
745+
.. code-block:: ini
746+
747+
[Unit]
748+
Description=Symfony messenger-consume %i
749+
750+
[Service]
751+
ExecStart=php /path/to/your/app/bin/console messenger:consume async --time-limit=3600
752+
Restart=always
753+
RestartSec=30
754+
755+
[Install]
756+
WantedBy=default.target
757+
758+
Now, tell systemd to enable and start one worker:
759+
760+
.. code-block:: terminal
761+
E377
762+
$ systemctl --user enable messenger-worker@1.service
763+
$ systemctl --user start messenger-worker@1.service
764+
765+
# to enable and start 20 workers
766+
$ systemctl --user enable messenger-worker@{1..20}.service
767+
$ systemctl --user start messenger-worker@{1..20}.service
768+
769+
If you change your service config file, you need to reload the daemon:
770+
771+
.. code-block:: terminal
772+
773+
$ systemctl --user daemon-reload
774+
775+
To restart all your consumers:
776+
777+
.. code-block:: terminal
778+
779+
$ systemctl --user restart messenger-consume@*.service
780+
781+
The systemd user instance is only started after the first login of the
782+
particular user. Consumer often need to start on system boot instead.
783+
Enable lingering on the user to activate that behavior:
784+
785+
.. code-block:: terminal
786+
787+
$ loginctl enable-linger <your-username>
788+
789+
Logs are managed by journald and can be worked with using the journalctl
790+
command:
791+
792+
.. code-block:: terminal
793+
794+
# follow logs of consumer nr 11
795+
$ journalctl -f --user-unit messenger-consume@11.service
796+
797+
# follow logs of all consumers
798+
$ journalctl -f --user-unit messenger-consume@*
799+
800+
# follow all logs from your user services
801+
$ journalctl -f _UID=$UID
802+
803+
See the `systemd docs`_ for more details.
804+
805+
.. note::
806+
807+
You either need elevated privileges for the ``journalctl`` command, or add
808+
your user to the systemd-journal group:
809+
810+
.. code-block:: terminal
811+
812+
$ sudo usermod -a -G systemd-journal <your-username>
813+
711814
Stateless Worker
712815
~~~~~~~~~~~~~~~~
713816

@@ -2100,6 +2203,8 @@ middleware and *only* include your own:
21002203
If a middleware service is abstract, a different instance of the service will
21012204
be created per bus.
21022205

2206+
.. _middleware-doctrine:
2207+
21032208
Middleware for Doctrine
21042209
~~~~~~~~~~~~~~~~~~~~~~~
21052210

@@ -2283,6 +2388,7 @@ Learn more
22832388
.. _`streams`: https://redis.io/topics/streams-intro
22842389
.. _`Supervisor docs`: http://supervisord.org/
22852390
.. _`PCNTL`: https://www.php.net/manual/book.pcntl.php
2391+
.. _`systemd docs`: https://www.freedesktop.org/wiki/Software/systemd/
22862392
.. _`SymfonyCasts' message serializer tutorial`: https://symfonycasts.com/screencast/messenger/transport-serializer
22872393
.. _`Long polling`: https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-short-and-long-polling.html
22882394
.. _`Visibility Timeout`: https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html

service_container.rst

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -56,16 +56,21 @@ What other services are available? Find out by running:
5656
5757
# this is just a *small* sample of the output...
5858
59-
Describes a logger instance.
60-
Psr\Log\LoggerInterface (monolog.logger)
59+
Autowirable Types
60+
=================
6161
62-
Request stack that controls the lifecycle of requests.
63-
Symfony\Component\HttpFoundation\RequestStack (request_stack)
62+
The following classes & interfaces can be used as type-hints when autowiring:
6463
65-
RouterInterface is the interface that all Router classes must implement.
66-
Symfony\Component\Routing\RouterInterface (router.default)
64+
Describes a logger instance.
65+
Psr\Log\LoggerInterface (logger)
6766
68-
[...]
67+
Request stack that controls the lifecycle of requests.
68+
Symfony\Component\HttpFoundation\RequestStack (request_stack)
69+
70+
RouterInterface is the interface that all Router classes must implement.
71+
Symfony\Component\Routing\RouterInterface (router.default)
72+
73+
[...]
6974
7075
When you use these type-hints in your controller methods or inside your
7176
:ref:`own services <service-container-creating-service>`, Symfony will automatically

0 commit comments

Comments
 (0)
0