leandrofull / task-manager
异步任务管理器
1.1.1
2024-09-05 13:19 UTC
Requires
- php: >=8.3.0
This package is auto-updated.
Last update: 2024-09-05 17:17:21 UTC
README
如果您想在并行执行操作而不影响您的应用程序导航性能,这个库对您非常有用。
首先,您需要通过Composer安装它
composer require leandrofull/task-manager
如何使用
<?php use LeandroFull\TaskManager\Manager\{DoctrineTaskManager, TaskManager}; require __DIR__ . '/vendor/autoload.php'; // Example class with method to be performed asynchronously class MailSender { public function send(string $to): void { echo "send to {$to}..." . PHP_EOL; } } // Create a Task Manager - Management by files $taskManager = new TaskManager( tasksPath: __DIR__ . '/var', // Enter an existing directory to store tasks and log maxAttempts: 3, // Max attempts in case of error - Default: 3 ); // Create a Task Manager - Management by Database (Doctrine) $taskManager = new DoctrineTaskManager( maxAttempts: 3, // Max attempts in case of error dsn: 'pdo-sqlite://ignored:ignored@ignored:1234/somedb.sqlite', ); // Create Task $task = $taskManager->create( objectOrClass: new MailSender(), // Enter class name instead of instance if method is static method: 'send', // Method name args: ['test@test.com.br'], // Default: [] taskTitle: 'Send Email', // Default: '' taskTag: 'mailsend', // Default: 'default' datetime: new DateTimeImmutable('2024-09-02 10:00'), // Datetime to perform the task - Default: 'now' ); // Return created task or null if ($task === null) throw new \Exception('Task not created'); // Store the Task ID $taskId = $task->id; // Store the Task Tag $taskTag = $task->tag; // Way 1: Run a Task $task = $taskManager->getById($taskId); $taskManager->run($task); // Way 2: Run Multiple Tasks using map method $tasks = $taskManager->getByTag($taskTag); // Or $taskManager->getAll(); $tasks->map(function($task) use ($taskManager) { $taskManager->run($task); sleep(1); // Interval }); // Way 3: Run Multiple Tasks using tasks array $tasks = $taskManager->getByTag($taskTag)->toArray(); // Or $taskManager->getAll()->toArray(); foreach ($tasks as $task) { if ($task !== null) $taskManager->run($task); sleep(1); // Interval } /* Result in Console: send to test@test.com.br... */ /* Result in '/var/.log': [SUCCESS] ID: ef7b4c20437ab82e849ffe0bf7a77ef803dde84c - Title: Send Email - Tag: mailsend */
CLI
配置任务管理器: php vendor/bin/taskmanager manager:config [别名] [...参数]
通过ID运行任务: php vendor/bin/taskmanager manager:run [任务ID]
通过标签运行多个任务(无限循环脚本): php vendor/bin/taskmanager manager:runtag [任务标签] [间隔]
运行所有任务(无限循环脚本): php vendor/bin/taskmanager manager:runall [间隔]
注意:间隔参数定义了每个任务之间的时间
配置示例 - 文件管理
参数:tasks_path,max_attempts(可选)
php vendor/bin/taskmanager manager:config files 'C:\Users\user\Desktop\project\var'
配置示例 - 数据库管理(Doctrine)
参数:max_attempts,dsn
阅读:Doctrine配置
php vendor/bin/taskmanager manager:config doctrine 3 'pdo-sqlite://ignored:ignored@ignored:1234/somedb.sqlite'
实际示例
classes.php
<?php use LeandroFull\TaskManager\Manager\TaskManagerInterface; interface MailSenderInterface { public function from(string $from): self; public function to(string $to): self; public function subject(string $subject): self; public function message(string $message): self; public function send(): void; } class MailSender implements MailSenderInterface { private string $from_var; private string $to_var; private string $subject_var; private string $message_var; public function from(string $from): self { $this->from_var = $from; return $this; } public function to(string $to): self { $this->to_var = $to; return $this; } public function subject(string $subject): self { $this->subject_var = $subject; return $this; } public function message(string $message): self { $this->message_var = $message; return $this; } public function send(): void { // Send email } } class AsyncMailSender implements MailSenderInterface { public function __construct( private readonly MailSenderInterface $sender, private readonly TaskManagerInterface $manager, ) {} public function from(string $from): self { $this->sender->from($from); return $this; } public function to(string $to): self { $this->sender->to($to); return $this; } public function subject(string $subject): self { $this->sender->subject($subject); return $this; } public function message(string $message): self { $this->sender->message($message); return $this; } public function send(): void { $task = $this->manager->create( objectOrClass: $this->sender, method: 'send', args: [], taskTitle: 'Send Email', taskTag: 'mailsend', ); if ($task === null) throw new \Exception('Unexpected error'); } }
file1.php
<?php use LeandroFull\TaskManager\Manager\TaskManager; require __DIR__ . '/classes.php'; require __DIR__ . '/vendor/autoload.php'; $taskManager = new TaskManager(__DIR__ . '/var', 2); // Or $taskManager = new DoctrineTaskManager(3, 'pdo-sqlite://ignored:ignored@ignored:1234/somedb.sqlite'); $mailSender = new AsyncMailSender(new MailSender(), $taskManager); $mailSender->send(); // Create a email sending task
file2.php
<?php use LeandroFull\TaskManager\Manager\TaskManager; require __DIR__ . '/classes.php'; require __DIR__ . '/vendor/autoload.php'; $taskManager = new TaskManager(__DIR__ . '/var', 2); // Or $taskManager = new DoctrineTaskManager(3, 'pdo-sqlite://ignored:ignored@ignored:1234/somedb.sqlite'); set_time_limit(0); while (true) { $tasks = $taskManager->getAll(); $tasks->map(function($task) use ($taskManager) { $taskManager->run($task); sleep(5); // Interval }); }
/var/tasks/.log
[SUCCESS] ID: 482fff92c74c74c985653812081f874164d91174 - Title: Send Email - Tag: mailsend