From 07fbe98bb79619f6b02039a9171dd7773e070b52 Mon Sep 17 00:00:00 2001 From: Dimitri Sitchet Tomkeu Date: Sat, 29 Aug 2026 20:05:12 +0100 Subject: [PATCH 1/6] =?UTF-8?q?feat:=20ajout=20de=20m=C3=A9thodes=20pour?= =?UTF-8?q?=20g=C3=A9rer=20les=20jobs=20dans=20la=20file=20d'attente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Job.php | 43 +++++++++++++++++++++++++++++++++++++ src/Traits/Dispatchable.php | 2 +- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/Job.php b/src/Job.php index 8a69717..0b4f100 100644 --- a/src/Job.php +++ b/src/Job.php @@ -11,9 +11,12 @@ namespace BlitzPHP\Queue; +use BlitzPHP\Queue\Config\Services; use BlitzPHP\Queue\Traits\Dispatchable; use BlitzPHP\Queue\Traits\InteractsWithQueue; use BlitzPHP\Queue\Traits\SerializesModels; +use DateInterval; +use DateTimeInterface; /** * Classe de base des jobs métier destinés à la file d'attente. @@ -66,4 +69,44 @@ public function queue(): string { return $this->queue; } + + /** + * Ajoute le job sur la queue dans la file d'attente + */ + public function push(): mixed + { + return $this->pushOn($this->queue); + } + + /** + * Ajoute le job sur une queue spécifique dans la file d'attente + */ + public function pushOn(string $queue): mixed + { + return Services::queue()->pushOn($queue, $this); + } + + /** + * Ajoute le job avec délai dans la file d'attente + */ + public function pushLater(DateInterval|DateTimeInterface|int $delay): mixed + { + return $this->pushLaterOn($this->queue, $delay); + } + + /** + * Ajoute le job sur une queue spécifique avec délai dans la file d'attente + */ + public function pushLaterOn(string $queue, DateInterval|DateTimeInterface|int $delay): mixed + { + return Services::queue()->laterOn($queue, $delay, $this); + } + + /** + * Execute le job immédiatement (synchrone) + */ + public function execute(): void + { + Services::container()->call([$this, 'handle']); + } } diff --git a/src/Traits/Dispatchable.php b/src/Traits/Dispatchable.php index 8e28706..c1d4926 100644 --- a/src/Traits/Dispatchable.php +++ b/src/Traits/Dispatchable.php @@ -67,6 +67,6 @@ public static function dispatchSync(mixed ...$parameters): void { $job = new static(...$parameters); - $job->handle(); + Services::container()->call([$job, 'handle']); } } From 256ccf3918061e654c1fa959e61054c387e3853f Mon Sep 17 00:00:00 2001 From: Dimitri Sitchet Tomkeu Date: Sat, 29 Aug 2026 20:06:20 +0100 Subject: [PATCH 2/6] fix: erreur lors de l'execution via http --- src/Commands/Work.php | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/Commands/Work.php b/src/Commands/Work.php index 1a16372..7c7756e 100644 --- a/src/Commands/Work.php +++ b/src/Commands/Work.php @@ -119,9 +119,7 @@ public function __construct(protected ContainerInterface $container, protected C $this->worker = service('worker'); $this->cache = $container->get(CacheInterface::class); $this->events = $container->get(EventManagerInterface::class); - - BaseHandler::setReservedCharacters(str_replace(':', '', config('cache.reserved_characters'))); - } + } /** * Exécute la commande console. @@ -162,7 +160,7 @@ public function execute(array $params) protected function runWorker(string $connection, string $queue): ?int { return $this->worker - ->setName($this->option('name')) + ->setName($this->option('name', 'default')) ->setCache($this->cache) ->{$this->option('once') ? 'runNextJob' : 'daemon'}( $connection, @@ -177,17 +175,17 @@ protected function runWorker(string $connection, string $queue): ?int protected function gatherWorkerOptions(): WorkerOptions { return new WorkerOptions( - $this->option('name'), - max($this->option('backoff'), $this->option('delay')), - $this->option('memory'), - $this->option('timeout'), - $this->option('sleep'), - $this->option('tries'), + $this->option('name', 'default'), + max($this->option('backoff', 0), $this->option('delay', 0)), + $this->option('memory', 128), + $this->option('timeout', 60), + $this->option('sleep', 3), + $this->option('tries', 1), $this->option('force', false), $this->option('stop-when-empty', false), - $this->option('max-jobs'), - $this->option('max-time'), - $this->option('rest'), + $this->option('max-jobs', 0), + $this->option('max-time', 0), + $this->option('rest', 0), ); } From 84933210fafce4c047190165644fb817de61ab01 Mon Sep 17 00:00:00 2001 From: Dimitri Sitchet Tomkeu Date: Sat, 29 Aug 2026 20:06:56 +0100 Subject: [PATCH 3/6] refactor: mise a jour des configurations --- src/Config/queue.php | 54 ++++++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/src/Config/queue.php b/src/Config/queue.php index d32e57d..cd2bfc1 100644 --- a/src/Config/queue.php +++ b/src/Config/queue.php @@ -49,7 +49,7 @@ * Groupe / nom de connexion base de données BlitzPHP à utiliser * pour lire et écrire les jobs. Variable : `queue.database.group`. */ - 'group' => env('queue.database.group', 'default'), + 'connection' => env('queue.database.group', 'default'), /** * Si `true`, réutilise une connexion partagée du gestionnaire de @@ -70,23 +70,23 @@ */ 'table' => env('queue.database.table', 'queue_jobs'), - /** - * Nom de la file logique par défaut pour cette connexion - * (colonne `queue` en base). Utilisé si `queue:work` n'en précise pas. - */ - // 'queue' => 'default', - - /** - * Délai en secondes au-delà duquel un job réservé est considéré - * comme expiré et peut être repris par un autre worker. - */ - // 'retry_after' => 60, - - /** - * Si `true`, n'envoie le job qu'après le commit des transactions - * de base de données en cours. - */ - // 'after_commit' => false, + /** + * Nom de la file logique par défaut pour cette connexion + * (colonne `queue` en base). Utilisé si `queue:work` n'en précise pas. + */ + 'queue' => env('queue.defaultQueue', 'default'), + + /** + * Délai en secondes au-delà duquel un job réservé est considéré + * comme expiré et peut être repris par un autre worker. + */ + 'retry_after' => (int) env('queue.retryAfter', 90), + + /** + * Si `true`, n'envoie le job qu'après le commit des transactions + * de base de données en cours. + */ + 'after_commit' => false, ], /** @@ -215,9 +215,12 @@ * Pilote SQL : table `queue_jobs` (ou celle configurée). */ 'database' => DatabaseDriver::class, - // 'redis' => \BlitzPHP\Queue\Drivers\Redis::class, - // 'predis' => \BlitzPHP\Queue\Drivers\Predis::class, - // 'rabbitmq' => \BlitzPHP\Queue\Drivers\RabbitMQ::class, + // 'redis' => \BlitzPHP\Queue\Drivers\RedisDriver::class, + // 'predis' => \BlitzPHP\Queue\Drivers\PredisDriver::class, + // 'rabbitmq' => \BlitzPHP\Queue\Drivers\RabbitMQDriver::class, + 'sync' => \BlitzPHP\Queue\Drivers\SyncDriver::class, + 'null' => \BlitzPHP\Queue\Drivers\NullDriver::class, + 'failover' => \BlitzPHP\Queue\Drivers\FailoverDriver::class, ], /** @@ -249,10 +252,13 @@ 'database' => env('db.connection', 'default'), /** - * Table SQL des jobs échoués (`uuid`, `connection`, `queue`, `payload`, - * `exception`, `failed_at`). + * Table SQL des jobs échoués (`uuid`, `connection`, `queue`, `payload`, `exception`, `failed_at`). */ 'table' => 'queue_failed_jobs', + + // Pour le driver 'file' + // 'path' => storage_path('logs/failed_jobs.json'), + // 'limit' => 100, ], /** @@ -269,6 +275,6 @@ /** * Nom de la table (ou identifiant de stockage) des lots de jobs. */ - 'table' => 'queue.job_batches', + 'table' => 'queue_job_batches', ], ]; From 8db64eb2ed2830cf02ce97bacc6ca7ea3b4801f7 Mon Sep 17 00:00:00 2001 From: Dimitri Sitchet Tomkeu Date: Sat, 29 Aug 2026 20:22:45 +0100 Subject: [PATCH 4/6] style: cs-fix --- src/Commands/Work.php | 3 +-- src/Config/queue.php | 33 +++++++++++++++++--------------- src/Events/QueueEventManager.php | 2 +- src/Job.php | 6 +++--- src/Traits/Dispatchable.php | 2 +- 5 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/Commands/Work.php b/src/Commands/Work.php index 7c7756e..d799063 100644 --- a/src/Commands/Work.php +++ b/src/Commands/Work.php @@ -11,7 +11,6 @@ namespace BlitzPHP\Queue\Commands; -use BlitzPHP\Cache\Handlers\BaseHandler; use BlitzPHP\Cli\Console\Command; use BlitzPHP\Cli\Console\Console; use BlitzPHP\Contracts\Cache\CacheInterface; @@ -119,7 +118,7 @@ public function __construct(protected ContainerInterface $container, protected C $this->worker = service('worker'); $this->cache = $container->get(CacheInterface::class); $this->events = $container->get(EventManagerInterface::class); - } + } /** * Exécute la commande console. diff --git a/src/Config/queue.php b/src/Config/queue.php index cd2bfc1..94d616d 100644 --- a/src/Config/queue.php +++ b/src/Config/queue.php @@ -10,6 +10,9 @@ */ use BlitzPHP\Queue\Drivers\DatabaseDriver; +use BlitzPHP\Queue\Drivers\FailoverDriver; +use BlitzPHP\Queue\Drivers\NullDriver; +use BlitzPHP\Queue\Drivers\SyncDriver; /** * Configuration du composant de files d'attente (queue). @@ -70,22 +73,22 @@ */ 'table' => env('queue.database.table', 'queue_jobs'), - /** - * Nom de la file logique par défaut pour cette connexion - * (colonne `queue` en base). Utilisé si `queue:work` n'en précise pas. - */ + /** + * Nom de la file logique par défaut pour cette connexion + * (colonne `queue` en base). Utilisé si `queue:work` n'en précise pas. + */ 'queue' => env('queue.defaultQueue', 'default'), - /** - * Délai en secondes au-delà duquel un job réservé est considéré - * comme expiré et peut être repris par un autre worker. - */ + /** + * Délai en secondes au-delà duquel un job réservé est considéré + * comme expiré et peut être repris par un autre worker. + */ 'retry_after' => (int) env('queue.retryAfter', 90), - /** - * Si `true`, n'envoie le job qu'après le commit des transactions - * de base de données en cours. - */ + /** + * Si `true`, n'envoie le job qu'après le commit des transactions + * de base de données en cours. + */ 'after_commit' => false, ], @@ -218,9 +221,9 @@ // 'redis' => \BlitzPHP\Queue\Drivers\RedisDriver::class, // 'predis' => \BlitzPHP\Queue\Drivers\PredisDriver::class, // 'rabbitmq' => \BlitzPHP\Queue\Drivers\RabbitMQDriver::class, - 'sync' => \BlitzPHP\Queue\Drivers\SyncDriver::class, - 'null' => \BlitzPHP\Queue\Drivers\NullDriver::class, - 'failover' => \BlitzPHP\Queue\Drivers\FailoverDriver::class, + 'sync' => SyncDriver::class, + 'null' => NullDriver::class, + 'failover' => FailoverDriver::class, ], /** diff --git a/src/Events/QueueEventManager.php b/src/Events/QueueEventManager.php index 422c550..240116d 100644 --- a/src/Events/QueueEventManager.php +++ b/src/Events/QueueEventManager.php @@ -27,8 +27,8 @@ class QueueEventManager /** * Noms d'événements des opérations de file. */ + public const JOB_POPPING = 'queue.job.popping'; - public const JOB_POPPING = 'queue.job.popping'; public const JOB_POPPED = 'queue.job.popped'; public const JOB_PUSHED = 'queue.job.pushed'; public const JOB_PUSH_FAILED = 'queue.job.push.failed'; diff --git a/src/Job.php b/src/Job.php index 0b4f100..8781a74 100644 --- a/src/Job.php +++ b/src/Job.php @@ -70,12 +70,12 @@ public function queue(): string return $this->queue; } - /** + /** * Ajoute le job sur la queue dans la file d'attente */ public function push(): mixed { - return $this->pushOn($this->queue); + return $this->pushOn($this->queue); } /** @@ -91,7 +91,7 @@ public function pushOn(string $queue): mixed */ public function pushLater(DateInterval|DateTimeInterface|int $delay): mixed { - return $this->pushLaterOn($this->queue, $delay); + return $this->pushLaterOn($this->queue, $delay); } /** diff --git a/src/Traits/Dispatchable.php b/src/Traits/Dispatchable.php index c1d4926..984962a 100644 --- a/src/Traits/Dispatchable.php +++ b/src/Traits/Dispatchable.php @@ -67,6 +67,6 @@ public static function dispatchSync(mixed ...$parameters): void { $job = new static(...$parameters); - Services::container()->call([$job, 'handle']); + Services::container()->call([$job, 'handle']); } } From 162c8113fec102b1989189a8f4af89b4e0168186 Mon Sep 17 00:00:00 2001 From: Dimitri Sitchet Tomkeu Date: Sat, 29 Aug 2026 20:28:37 +0100 Subject: [PATCH 5/6] Merge branch 'devs' of github-personal:blitz-php/queue into devs --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 65aab65..ab3f086 100644 --- a/composer.json +++ b/composer.json @@ -1,7 +1,7 @@ { "name": "blitz-php/queue", "description": "Gestionnaire de file d'attente pour BlitzPHP", - "keywords": ["blitz-php", "blitz php", "queue", "worker", "database", "redis", "predis", "file d'attente" ], + "keywords": ["blitz-php", "blitz php", "queue", "worker", "database", "redis", "predis" ], "homepage": "https://github.com/blitz-php/queue", "license": "MIT", "type": "library", From 0e44aa18823fbe859d0ada5e35605236f4d178c4 Mon Sep 17 00:00:00 2001 From: Dimitri Sitchet Tomkeu Date: Thu, 3 Sep 2026 07:54:05 +0100 Subject: [PATCH 6/6] fix: correction de bugs pour les version php inferieures --- src/Commands/Work.php | 2 +- src/Config/Services.php | 4 +++- src/Traits/Dispatchable.php | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Commands/Work.php b/src/Commands/Work.php index d799063..543bf2e 100644 --- a/src/Commands/Work.php +++ b/src/Commands/Work.php @@ -348,7 +348,7 @@ protected function getQueue(string $connection): string /** * Indique si l'application est en maintenance (et si le worker doit s'arrêter). */ - protected function downForMaintenance(): false + protected function downForMaintenance(): bool { return $this->option('force') ? false diff --git a/src/Config/Services.php b/src/Config/Services.php index 9551cf1..1e0a20a 100644 --- a/src/Config/Services.php +++ b/src/Config/Services.php @@ -76,7 +76,9 @@ public static function worker(bool $shared = true): Worker } } - memory_reset_peak_usage(); + if (function_exists('memory_reset_peak_usage')) { + memory_reset_peak_usage(); + } }; return static::$instances[Worker::class] = new Worker( diff --git a/src/Traits/Dispatchable.php b/src/Traits/Dispatchable.php index 984962a..8e28706 100644 --- a/src/Traits/Dispatchable.php +++ b/src/Traits/Dispatchable.php @@ -67,6 +67,6 @@ public static function dispatchSync(mixed ...$parameters): void { $job = new static(...$parameters); - Services::container()->call([$job, 'handle']); + $job->handle(); } }