本次更新主要新增了 秒級定時任務
hyper/crontab 組件,以及修復了一些其它組件的 Bug
retry()
函數的 $times
參數的行為意義, 表示重試的次數而不是執行的次數;Hyperf\Di\Container
的 has()
方法, 當傳遞一個不可實例化的示例(如介面)至 $container->has($interface)
方法時,會返回 false
;tests
文件夾;LengthAwarePaginator::nextPageUrl()
方法返回值的類型約束;ssl_key
和 cert
配置項不能正常工作的問題;通常來說,執行定時任務會通過 Linux 的 crontab
命令來實現,但現實情況下,並不是所有開發人員都能夠擁有生產環境的伺服器去設置定時任務的,這裡 hyperf/crontab 組件為您提供了一個 秒級
定時任務功能,只需通過簡單的定義即可完成一個定時任務的定義。
composer require hyperf/crontab
在使用定時任務組件之前,需要先在 config/autoload/processes.php
內註冊一下 Hyperf\Crontab\Process\CrontabDispatcherProcess
自定義進程,如下:
<?php
// config/autoload/processes.php
return [
Hyperf\Crontab\Process\CrontabDispatcherProcess::class,
];
這樣服務啟動時會啟動一個自定義進程,用於對定時任務的解析和調度分發。如果您沒有註冊該進程,亦可理解為您關閉了定時任務功能。
您可於 config/autoload/crontab.php
的配置文件內配置您所有的定時任務,文件返回一個 Hyperf\Crontab\Crontab[]
結構的數組,如配置文件不存在可自行創建:
<?php
// config/autoload/crontab.php
use Hyperf\Crontab\Crontab;
return [
(new Crontab())->setName('Foo')->setRule('* * * * *')->setCallback([App\Task\FooTask::class, 'execute'])->setMemo('這是一個示例的定時任務'),
];
通過 @Crontab
註解可以快速完成對一個任務的定義,以下的定義示例與配置文件定義所達到的目的都是一樣的。定義一個名為 Foo
每分鐘執行一次 App\Task\FooTask::execute()
的定時任務。
<?php
namespace App\Task;
use Hyperf\Contract\StdoutLoggerInterface;
use Hyperf\Crontab\Annotation\Crontab;
/**
* @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()));
}
}
定時任務的名稱,可以為任意字元串,各個定時任務之間的名稱要唯一。
定時任務的執行規則,在分鐘級的定義時,與 Linux 的 crontab
命令的規則一致,在秒級的定義時,規則長度從 5 位變成 6 位,在規則的前面增加了對應秒級的節點,如 */5 * * * * *
則代表每 5 秒執行一次。注意在註解定義時,規則存在 \
符號時,需要進行轉義處理,即填寫 *\/5 * * * * *
。
定時任務的執行回調,即計劃任務實際執行的代碼,在通過配置文件定義時,這裡需要傳遞一個 [$class, $method]
的數組,$class
為一個類的全稱,$method
為 $class
內的一個 public
方法。當通過註解定義時,只需要提供一個當前類內的 public
方法的方法名即可,如果當前類只有一個 public
方法,您甚至可以不提供該屬性。
定時任務的備註,該屬性為可選屬性,沒有任何邏輯上的意義,僅供開發人員查閱幫助對該計劃任務的理解。
定時任務在設計上允許通過不同的策略來調度分發執行任務,目前僅提供了 多進程執行策略
、協程執行策略
兩種策略,默認為 多進程執行策略
,後面的迭代會增加更多更強的策略。
通過在 config/dependencies.php
更改 Hyperf\Crontab\Strategy\StrategyInterface
介面類所對應的實例來更改目前所使用的策略,默認情況下使用 多進程執行策略
,對應的類為 Hyperf\Crontab\Strategy\ProcessStrategy
,如我們希望更改策略為一個新的策略,比如為 App\Crontab\Strategy\FooStrategy
,那麼如下:
<?php
return [
'dependencies' => [
\Hyperf\Crontab\Strategy\StrategyInterface::class => \App\Crontab\Strategy\FooStrategy::class,
],
];
多進程執行策略
策略類:Hyperf\Crontab\Strategy\ProcessStrategy
默認情況下使用此策略,即為 CrontabDispatcherProcess
進程解析定時任務,並通過進程間通訊輪訓傳遞執行任務到各個 Worker
進程中,由各個 Worker
進程以協程來實際運行執行任務。
協程執行策略
策略類:Hyperf\Crontab\Strategy\CoroutineStrategy
默認情況下使用此策略,即為 CrontabDispatcherProcess
進程解析定時任務,並在進程內為每個執行任務創建一個協程來運行。
Hyperf 是基於 Swoole 4.3+
實現的高性能、高靈活性的 PHP 協程框架,內置協程伺服器及大量常用的組件,性能較傳統基於 PHP-FPM
的框架有質的提升,提供超高性能的同時,也保持著極其靈活的可擴展性,標準組件均均基於 PSR 標準 實現,基於強大的依賴注入設計,保證了絕大部分組件或類都是 可替換
與 可復用
的。 框架組件庫除了常見的協程版的 MySQL 客戶端
、Redis 客戶端
,還為您準備了協程版的 Eloquent ORM
、WebSocket 服務端及客戶端
、JSON RPC 服務端及客戶端
、GRPC 服務端及客戶端
、Zipkin (OpenTracing) 客戶端
、Guzzle HTTP 客戶端
、Elasticsearch 客戶端
、Consul 客戶端
、ETCD 客戶端
、AMQP 組件
、Apollo 配置中心
、阿里雲 ACM 應用配置管理
、基於令牌桶演算法的限流器
、通用連接池
、熔斷器
、Swagger 文檔生成
等組件,省去了自己實現對應協程版本的麻煩,Hyperf 還提供了 基於 PSR-11 的依賴注入容器
、註解
、AOP 面向切面編程
、基於 PSR-15 的中間件
、自定義進程
、基於 PSR-14 的事件管理器
、Redis/RabbitMQ 消息隊列
、自動模型緩存
、基於 PSR-16 的緩存
等非常便捷的功能,滿足豐富的技術場景和業務場景,開箱即用。
儘管現在基於 PHP 語言開發的框架處於一個百花爭鳴的時代,但仍舊未能看到一個優雅的設計與超高性能的共存的完美框架,亦沒有看到一個真正為 PHP 微服務鋪路的框架,此為 Hyperf 及其團隊成員的初衷,我們將持續投入並為此付出努力,也歡迎你加入我們參與開源建設。
Hyperspeed + Flexibility = Hyperf
,從名字上我們就將 超高速
和 靈活性
作為 Hyperf 的基因。
基於以上的特點,Hyperf 將存在豐富的可能性,如實現 Web 服務,網關服務,分散式中間件,微服務架構,遊戲伺服器,物聯網(IOT)等。
我們投入了大量的時間用於文檔的建設,以解決各種因為文檔缺失所帶來的問題,文檔上也提供了大量的示例,對新手同樣友好。
我們為組件進行了大量的單元測試以保證邏輯的正確,同時維護了高質量的文檔,在 Hyperf 正式對外開放(2019年6月20日)之前,便已在一家 C輪 和一家 B輪 互聯網公司上線了多個服務並以穩定的姿態完美的運行了超過半年時間,經過了嚴酷的生產環境的考驗,我們才正式的對外開放該項目。
[admin
]