Hyperf定時任務


 

官方文檔:https://hyperf.wiki/2.1/#/zh-cn/crontab

 

定義方法:1、注解定義

     2、配置文件定義

 

特色:提供了秒級定時任務功能

 

任務屬性:

     1、name   =>  定時任務名稱

     2、rule     =>  定時任務規則

       3、callback   =>    定時任務回調

     4、memo      =>  定時任務備注

       5、enable   =>  是否生效

 

配置要求:

     1、安裝組件 composer require hyperf/crontab

     2、啟動任務調度進程

        2.1、在config/autoload/processes.php  下注冊       

<?php
// config/autoload/processes.php
return [
    Hyperf\Crontab\Process\CrontabDispatcherProcess::class,
];

      2.2、在config/autoload/crontab.php  下配置

<?php
return [
    // 是否開啟定時任務
    'enable' => true,
];

 

 

注解定義:

<?php
namespace App\Task;

use Hyperf\Contract\StdoutLoggerInterface;
use Hyperf\Crontab\Annotation\Crontab;
use Hyperf\Di\Annotation\Inject;

/**
 * @Crontab(name="Foo", rule="* * * * *", callback="execute", memo="這是一個示例的定時任務")
 */
class FooTask
{
    /**
     * @Inject()
     * @var \Hyperf\Contract\StdoutLoggerInterface
     */
    private $logger;

    public function execute()
    {
        $this->logger->info(date('Y-m-d H:i:s', time()));
    }
    
    /**
     * @Crontab(rule="* * * * * *", memo="foo")
     */
    public function foo()
    {
        var_dump('foo');
    }
}

 

   

配置文件定義:

      在 config/autoload/crontab.php 配置定時任務

<?php
// config/autoload/crontab.php
use Hyperf\Crontab\Crontab;
return [
    'enable' => true,
    // 通過配置文件定義的定時任務
    'crontab' => [
        // Callback類型定時任務(默認)
        (new Crontab())->setName('Foo')->setRule('30 8 * * *')->setCallback([App\Task\FooTask::class, 'execute'])->setMemo('這是一個示例的定時任務'), ];

 

 

注意點:singleton解決任務的並發執行問題,任務永遠只會同時運行 1 個。但是這個沒法保障任務在集群時重復執行的問題。

   問題假如有多個節點同時請求這個定時任務

   方案:redis鎖

      第一個請求的節點存固定數據,並設置過期時間,其他節點請求時判斷存的數據是否存在,存在則跳過

   例如:

  

  $redis = make(RedisService::class);
  if ($redis->exists('key')) return null;
  $redis->set('key', 1, 60);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM