rewieer / taskschedulerbundle
使用CRON的Symfony任务调度器
Requires
- php: ^7.4|^8.1
- dragonmantank/cron-expression: ^3.3
- symfony/console: ^5.3|^6.4|^7.0
- symfony/deprecation-contracts: ^2.5|^3.4
- symfony/framework-bundle: ^5.4|^6.4|^7.0
Requires (Dev)
- monolog/monolog: ^2.9
- phpunit/phpunit: ^9.6
- symfony/phpunit-bridge: ^6.4
README
为使用CRON作业迁移任务的Symfony应用程序提供任务调度器,允许您定期运行任务。
要求
为了使此包正常工作,您必须在您的服务器上能够定义CRON作业。
安装
首先,将包添加到您的composer.json文件中:composer require rewieer/taskschedulerbundle
Symfony Flex将自动为您启用该包。如果您尚未使用Flex,请将包添加到您的AppKernel.php文件中。
// in AppKernel::registerBundles() $bundles = array( // ... new Rewieer\TaskSchedulerBundle\RewieerTaskSchedulerBundle(), // ... );
您现在可以开始调度了!
用法
首先,将以下行添加到您的CRON表中:* * * * * php /path/to/your/project/bin/console ts:run >> /dev/null 2>&1
这将调用调度器,它会审查所有已安排的任务并根据需要进行调度。您可以通过向命令提供任务的ID作为参数来直接调用任务。请注意,此ID由调度器生成,与该服务本身无关。
选项
>> /dev/null 2>&1会丢弃任务的打印结果。移除它可以将结果通过电子邮件发送。这可能因服务器的配置而异,请参阅服务器配置。
接下来,您需要创建一个任务。任务可以是任何服务!您只需要给它一个ts.task标签并实现TaskInterface,或者为了简单起见,从AbstractScheduledTask扩展。
每X分钟
在Foo\Bar\Task中安排一个每5分钟执行的任务
use Rewieer\TaskSchedulerBundle\Task\AbstractScheduledTask; use Rewieer\TaskSchedulerBundle\Task\Schedule; class Task extends AbstractScheduledTask { protected function initialize(Schedule $schedule) { $schedule ->everyMinutes(5); // Perform the task every 5 minutes } public function run() { // Do stuff } }
您的任务现在已安排,并将每5分钟执行一次。
每X小时或每天
如果您按小时或每天安排任务,您需要在hours()、everyHours()或daily()之外设置minutes()。如果省略minutes(),则任务将在预定的小时内每分钟执行一次。
在Foo\Bar\Task中安排一个每5小时执行的任务
use Rewieer\TaskSchedulerBundle\Task\AbstractScheduledTask; use Rewieer\TaskSchedulerBundle\Task\Schedule; class Task extends AbstractScheduledTask { protected function initialize(Schedule $schedule) { $schedule ->minutes(0) ->everyHours(5); // Perform the task every 5 hours on minute 0 // Or if you want to perform your task at midnight every day // $schedule->minutes(0)->hours(0)->daily(); // Or schedule your task to run once at 9AM daily (this is effectively the same as daily() above) // $schedule->minutes(0)->hours(9); } public function run() { // Do stuff } }
现在您可以检查日志,看看它是否按预期工作。