更新內容
本次更新主要新增了 秒級定時任務
hyper/crontab 組件,以及修復了一些其它組件的 Bug
Added
Changed
-
#195 變更
retry()
函數的$times
參數的行爲意義, 表示重試的次數而不是執行的次數; -
#198 優化
Hyperf\Di\Container
的has()
方法, 當傳遞一個不可實例化的示例(如接口)至$container->has($interface)
方法時,會返回false
; - #199 當生產 AMQP 消息失敗時,會自動重試一次;
-
#200 通過 Git 打包項目的部署包時,不再包含
tests
文件夾;
Fixed
-
#176 修復
LengthAwarePaginator::nextPageUrl()
方法返回值的類型約束; - #188 修復 Guzzle Client 的代理設置不生效的問題;
- #211 修復 RPC Client 存在多個時會被最後一個覆蓋的問題;
-
#212 修復 Guzzle Client 的
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()));
}
}
任務屬性
name
定時任務的名稱,可以爲任意字符串,各個定時任務之間的名稱要唯一。
rule
定時任務的執行規則,在分鐘級的定義時,與 Linux 的 crontab
命令的規則一致,在秒級的定義時,規則長度從 5 位變成 6 位,在規則的前面增加了對應秒級的節點,如 */5 * * * * *
則代表每 5 秒執行一次。注意在註解定義時,規則存在 \
符號時,需要進行轉義處理,即填寫 *\/5 * * * * *
。
callback
定時任務的執行回調,即計劃任務實際執行的代碼,在通過配置文件定義時,這裏需要傳遞一個 [$class, $method]
的數組,$class
爲一個類的全稱,$method
爲 $class
內的一個 public
方法。當通過註解定義時,只需要提供一個當前類內的 public
方法的方法名即可,如果當前類只有一個 public
方法,您甚至可以不提供該屬性。
memo
定時任務的備註,該屬性爲可選屬性,沒有任何邏輯上的意義,僅供開發人員查閱幫助對該計劃任務的理解。
調度分發策略
定時任務在設計上允許通過不同的策略來調度分發執行任務,目前僅提供了 多進程執行策略
、協程執行策略
兩種策略,默認爲 多進程執行策略
,後面的迭代會增加更多更強的策略。
更改調度分發策略
通過在 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
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 的基因。
- 對於超高速,我們基於 Swoole 協程並在框架設計上進行大量的優化以確保超高性能的輸出。
- 對於靈活性,我們基於 Hyperf 強大的依賴注入組件,組件均基於 PSR 標準 的契約和由 Hyperf 定義的契約實現,達到框架內的絕大部分的組件或類都是可替換的。
基於以上的特點,Hyperf 將存在豐富的可能性,如實現 Web 服務,網關服務,分佈式中間件,微服務架構,遊戲服務器,物聯網(IOT)等。
文檔齊全
我們投入了大量的時間用於文檔的建設,以解決各種因爲文檔缺失所帶來的問題,文檔上也提供了大量的示例,對新手同樣友好。
生產可用
我們爲組件進行了大量的單元測試以保證邏輯的正確,同時維護了高質量的文檔,在 Hyperf 正式對外開放(2019年6月20日)之前,便已在一家 C輪 和一家 B輪 互聯網公司上線了多個服務並以穩定的姿態完美的運行了超過半年時間,經過了嚴酷的生產環境的考驗,我們才正式的對外開放該項目。