There is no license information available for the latest version (v8.0.0) of this package.

bundle sf easing creating daemon commands

Installs: 276 685

Dependents: 0

Suggesters: 0

Security: 0

Stars: 59

Watchers: 48

Forks: 12

Open Issues: 0


v8.0.0 2024-05-27 19:20 UTC


Table of Contents

DaemonBundle Build Status

Allows you to create daemonized commands with the React event-loop component.


Via composer :

composer require m6web/daemon-bundle


  • If you are using a symfony version >= 4.3 use the lastest version
  • For symfony versions between 2.3 and 3.0, you can use m6web/daemon-bundle:^1.4
  • For PHP versions >=5.5.9 and <7.0 support, you can use m6web/daemon-bundle:^3.0

For more information about installation of plugin refers the documentation of symfony for your version.


You can optionally define events which are triggered each X iterations:

            count: 10
            name: Path\From\Your\Project\Event\EachTenEvent
            count: 5
            name: Path\From\Your\Project\Event\EachFiveEvent

Your event need to extends the AbstractDaemonEvent like following:


namespace Path\From\Your\Project\Event;

use M6Web\Bundle\DaemonBundle\Event\AbstractDaemonEvent;

class EachFiveEvent extends AbstractDaemonEvent

This bundle use the PSR-14 implementation for event dispatcher so you need to register the symfony event dispatcher in your config/services.yaml like this:

# config/services.yaml
    # ... others declarations

    Psr\EventDispatcher\EventDispatcherInterface: "@event_dispatcher"


This command uses the event-loop component which ReactPHP is used to run loops and other asynchronous tasks.


namespace App\Command;

use M6Web\Bundle\DaemonBundle\Command\DaemonCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class DaemonizedCommand extends DaemonCommand
    protected function configure()
            ->setDescription('My daemonized command');

    protected function setup(InputInterface $input, OutputInterface $output): void
        // Set up your daemon here

        // Add your own optional callback : called every 10 iterations
        $this->addIterationsIntervalCallback(10, [$this, 'executeEveryTenLoops']);

        // You can add your own Periodic Timer,
        // Here this timer will be called every 0.5s
        $daemon = $this;
        $this->loop->addPeriodicTimer(0.5, function ($timer) use ($daemon) {
            // It's the last loop, cancel the timer.
            if ($daemon->isLastLoop()) {

     * Execute is called at every loop
    protected function execute(InputInterface $input, OutputInterface $output)

        // This method helps to give back the CPU to the react-loop.
        // So you can wait between two iterations if your workers has nothing to do.

        $this->setNextIterationSleepingTime(1000000); // Every second

     * executeEveryTenLoops is called every 10 loops
    protected function executeEveryTenLoops(InputInterface $input, OutputInterface $output): void
        $output->writeln("Iteration " . $this->getLoopCount());

You also need to declare your command under the services:

# config/services
    # ... others declarations

        parent: M6Web\Bundle\DaemonBundle\Command\DaemonCommand
            - console.command

For information, you need to declare the autowire and autoconfigure parameters (to false) only if you have defaults parameters for services (under _default)

Run command

You can run a daemonized command as any other Symfony command with bin/console. DaemonCommand parent class provide additional options :

  • --run-once - Run the command just once
  • --run-max - Run the command x time
  • --memory-max - Gracefully stop running command when given memory volume, in bytes, is reached
  • --shutdown-on-exception - Ask for shutdown if an exception is thrown
  • --show-exceptions - Display exceptions on command output stream

Command events

Daemonized command trigger the following events :

  • DaemonEvents::DAEMON_START
  • DaemonEvents::DAEMON_LOOP_BEGIN
  • DaemonEvents::DAEMON_LOOP_END
  • DaemonEvents::DAEMON_STOP