Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions docs/zh-hk/components/amqp-job.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
## 簡介

`friendsofhyperf/amqp-job` 通過 `hyperf/amqp` 分發 PHP 任務對象。任務使用 `AmqpJob`
註解聲明 AMQP 綁定,服務啟動時,組件會為每個已啟用且帶有該註解的任務自動註冊消費者
註解聲明 AMQP 綁定,服務啓動時,組件會為每個已啓用且帶有該註解的任務自動註冊消費者

組件默認使用 PHP 序列化,因此只應分發可信的任務對象,並確保消費者可以加載對應的類。

Expand Down Expand Up @@ -60,11 +60,11 @@ function dispatchFoo(Producer $producer, int $id): bool
```

`dispatch(JobInterface $payload, ?bool $confirm = null, ?int $timeout = null): bool`
是創建並發布 `JobMessage` 的便捷函數。如果任務尚無任務 ID,它會為其分配唯一 ID。可選的
是創建併發布 `JobMessage` 的便捷函數。如果任務尚無任務 ID,它會為其分配唯一 ID。可選的
`confirm` 和 `timeout` 參數會覆蓋本次分發使用的任務值。

當前 `dispatch()` 不會將任務的交換機、路由鍵或連接池複製到 `JobMessage`。因此生成的生產者
消息會使用空交換機、空路由鍵和 Hyperf 的 `default` AMQP 連接池。若要發布到 `AmqpJob`
消息會使用空交換機、空路由鍵和 Hyperf 的 `default` AMQP 連接池。若要發佈到 `AmqpJob`
聲明的綁定,請像上例一樣創建 `JobMessage`、設置目的地,再交給 `Hyperf\Amqp\Producer`。

## 註解選項
Expand All @@ -83,7 +83,7 @@ function dispatchFoo(Producer $producer, int $id): bool
| `name` | `?string` | `null` | 消費者進程名稱。 |

如果任務未使用該註解,其 getter 默認返回交換機 `hyperf`、路由鍵 `hyperf.job`、無指定
連接池、關閉發布確認、5 秒發布超時和不重試。子類可以提供 `$exchange`、`$routingKey`、
連接池、關閉發佈確認、5 秒發佈超時和不重試。子類可以提供 `$exchange`、`$routingKey`、
`$poolName`、`$confirm`、`$timeout` 或 `$maxAttempts` 等受保護屬性來覆蓋這些 getter 值。
如上所述,`dispatch()` 只使用確認和超時 getter。

Expand All @@ -106,7 +106,7 @@ public function fail(Throwable $e): void
}
```

默認 Redis 次數鍵使用 `hyperf:amqp-job:attempts:` 前綴,並在 86,400 秒後過期,因此啟用
默認 Redis 次數鍵使用 `hyperf:amqp-job:attempts:` 前綴,並在 86,400 秒後過期,因此啓用
重試時必須可用 Redis。綁定 `FriendsOfHyperf\AmqpJob\Contract\Attempt` 或
`FriendsOfHyperf\AmqpJob\Contract\Packer` 可以替換默認實現。記錄異常時,消費者會依次
解析 `FriendsOfHyperf\AmqpJob\Contract\LoggerInterface` 和
Expand Down
73 changes: 36 additions & 37 deletions docs/zh-hk/components/cache.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,30 +3,30 @@
## 簡介

`friendsofhyperf/cache` 使用 Laravel 風格的倉庫 API 封裝 `hyperf/cache`
提供的驅動。它支援 PSR-16 操作、命名儲存、門面存取、快取事件、巨集以及
stale-while-revalidate 快取
提供的驅動。它支持 PSR-16 操作、命名存儲、門面訪問、緩存事件、宏以及
stale-while-revalidate 緩存

## 安裝

```shell
composer require friendsofhyperf/cache
```

該元件要求 Hyperf 3.2。其 `ConfigProvider` 會在容器中註冊
該組件要求 Hyperf 3.2。其 `ConfigProvider` 會在容器中註冊
`FriendsOfHyperf\Cache\Contract\Factory` 和
`FriendsOfHyperf\Cache\Contract\Repository`。

## 配置

該元件不會發佈獨立的配置檔案。請透過 `hyperf/cache` 配置驅動和命名儲存
`CacheManager::store($name)` 會將名稱傳給 Hyperf 的快取管理器。預設倉庫解析
`default` 儲存
該組件不會發布獨立的配置文件。請通過 `hyperf/cache` 配置驅動和命名存儲
`CacheManager::store($name)` 會將名稱傳給 Hyperf 的緩存管理器。默認倉庫解析
`default` 存儲

## 取得倉庫
## 獲取倉庫

### 依賴注入

注入 `Contract\Repository` 以使用預設儲存
注入 `Contract\Repository` 以使用默認存儲

```php
namespace App\Controller;
Expand All @@ -48,7 +48,7 @@ class IndexController
}
```

需要命名儲存時注入 `Contract\Factory`:
需要命名存儲時注入 `Contract\Factory`:

```php
use FriendsOfHyperf\Cache\Contract\Factory;
Expand All @@ -69,42 +69,42 @@ $users = Cache::store('redis')->get('users');
```

`Cache::driver($name)` 是 `Cache::store($name)` 的別名。
`Cache::resolve($name)` 會建立新倉庫,而不是傳回管理器中快取的倉庫實例
`Cache::resolve($name)` 會創建新倉庫,而不是返回管理器中緩存的倉庫實例

## 核心操作

倉庫實作了 `Psr\SimpleCache\CacheInterface`,因此可使用 `get()`、`set()`、
倉庫實現了 `Psr\SimpleCache\CacheInterface`,因此可使用 `get()`、`set()`、
`delete()`、`clear()`、`getMultiple()`、`setMultiple()`、`deleteMultiple()` 和
`has()`。此外還提供以下擴充
`has()`。此外還提供以下擴展

| 方法 | 行為 |
| --- | --- |
| `get($key, $default = null)` | 取得單個項目;未命中時會執行可呼叫的預設值。傳入陣列會轉交給 `many()`。 |
| `put($key, $value, $ttl = null)` | 儲存單個項目;`null` 表示永久儲存,非正數 TTL 會刪除該鍵。傳入關聯陣列會轉交給 `putMany()`,並將第二個參數用作其 TTL。 |
| `putMany($values, $ttl = null)` | 儲存多個項目;非正數 TTL 會刪除對應鍵。 |
| `forever($key, $value)` | 不設定 TTL 地儲存單個項目。 |
| `add($key, $value, $ttl = null)` | 僅當 `get($key)` 傳回 `null` 時儲存項目。 |
| `many($keys)` | 取得多個鍵;關聯陣列輸入可為每個鍵提供預設值。 |
| `pull($key, $default = null)` | 取得項目後將其刪除。 |
| `remember($key, $ttl, Closure $callback)` | 傳回快取值,或按 TTL 儲存回呼結果。 |
| `rememberForever($key, Closure $callback)` / `sear(...)` | 傳回快取值,或永久儲存回呼結果。 |
| `increment($key, $value = 1)` / `decrement(...)` | 讀取、調整並以無 TTL 方式儲存整數值。 |
| `get($key, $default = null)` | 獲取單個項目;未命中時會執行可調用的默認值。傳入數組會轉交給 `many()`。 |
| `put($key, $value, $ttl = null)` | 存儲單個項目;`null` 表示永久存儲,非正數 TTL 會刪除該鍵。傳入關聯數組會轉交給 `putMany()`,並將第二個參數用作其 TTL。 |
| `putMany($values, $ttl = null)` | 存儲多個項目;非正數 TTL 會刪除對應鍵。 |
| `forever($key, $value)` | 不設置 TTL 地存儲單個項目。 |
| `add($key, $value, $ttl = null)` | 僅當 `get($key)` 返回 `null` 時存儲項目。 |
| `many($keys)` | 獲取多個鍵;關聯數組輸入可為每個鍵提供默認值。 |
| `pull($key, $default = null)` | 獲取項目後將其刪除。 |
| `remember($key, $ttl, Closure $callback)` | 返回緩存值,或按 TTL 存儲回調結果。 |
| `rememberForever($key, Closure $callback)` / `sear(...)` | 返回緩存值,或永久存儲回調結果。 |
| `increment($key, $value = 1)` / `decrement(...)` | 讀取、調整並以無 TTL 方式存儲整數值。 |
| `flush()` | `clear()` 的別名。 |
| `missing($key)` | `has($key)` 的反向判斷。 |
| `getDriver()` / `getStore()` | 傳回底層 Hyperf `DriverInterface`。 |
| `getDriver()` / `getStore()` | 返回底層 Hyperf `DriverInterface`。 |

擴充倉庫方法接受的 TTL 可以是秒數、`DateInterval` 或 `DateTimeInterface`。
擴展倉庫方法接受的 TTL 可以是秒數、`DateInterval` 或 `DateTimeInterface`。

::: warning 行為邊界
倉庫會將已快取的 `null` 視為未命中。`add()`、`pull()` 和遞增/遞減方法由分離的
操作實作,因此不是原子操作。雖然 `pull()` 接受 `$default` 參數,但目前實作不會
將它傳給 `get()`,鍵不存在時傳回 `null`。
倉庫會將已緩存的 `null` 視為未命中。`add()`、`pull()` 和遞增/遞減方法由分離的
操作實現,因此不是原子操作。雖然 `pull()` 接受 `$default` 參數,但當前實現不會
將它傳給 `get()`,鍵不存在時返回 `null`。
:::

## Stale-While-Revalidate

`flexible()` 接受包含兩個 TTL 的陣列:第一個值是新鮮期,第二個值是快取值及其
內部建立時間戳使用的儲存 TTL。
`flexible()` 接受包含兩個 TTL 的數組:第一個值是新鮮期,第二個值是緩存值及其
內部創建時間戳使用的存儲 TTL。

```php
use FriendsOfHyperf\Cache\Facade\Cache;
Expand All @@ -117,32 +117,31 @@ $users = Cache::flexible('users', [30, 300], function () {
]);
```

快取未命中時,回呼立即執行。在新鮮期內直接傳回快取值;新鮮期結束後傳回舊值,
並透過延遲回呼嘗試在鎖內重新整理快取。如果其他進程已更新建立時間戳,則跳過
重新整理。
緩存未命中時,回調立即執行。在新鮮期內直接返回緩存值;新鮮期結束後返回舊值,
並通過延遲迴調嘗試在鎖內刷新緩存。如果其他進程已更新創建時間戳,則跳過刷新。

使用 `flexible()` 前需要安裝兩個可選依賴:

```shell
composer require friendsofhyperf/lock hyperf/coroutine
```

可選的鎖陣列接受 `seconds` 和 `owner`,預設值分別為 `0` 和 `null`。
可選的鎖數組接受 `seconds` 和 `owner`,默認值分別為 `0` 和 `null`。

## 事件

當容器提供 `Psr\EventDispatcher\EventDispatcherInterface` 時,倉庫會為讀取、
寫入、刪除和清空操作分派事件
寫入、刪除和清空操作分發事件

- `CacheHit`、`CacheMissed`、`RetrievingKey`、`RetrievingManyKeys`
- `WritingKey`、`WritingManyKeys`、`KeyWritten`、`KeyWriteFailed`
- `ForgettingKey`、`KeyForgotten`、`KeyForgetFailed`
- `CacheFlushing`、`CacheFlushed`

每個事件都包含儲存名稱。單鍵事件還包含鍵;適用時,寫入事件會公開值和 TTL,
批次事件會公開鍵,`WritingManyKeys` 還會公開值。批次讀取還會為每個傳回的鍵分派
每個事件都包含存儲名稱。單鍵事件還包含鍵;適用時,寫入事件會公開值和 TTL,
批量事件會公開鍵,`WritingManyKeys` 還會公開值。批量讀取還會為每個返回的鍵分發
`CacheHit` 或 `CacheMissed`。

## 參考

該 API 的設計受 Laravel Cache 啟發,但具體行為應以本元件的契約和實作為準
該 API 的設計受 Laravel Cache 啓發,但具體行為應以本組件的契約和實現為準
24 changes: 12 additions & 12 deletions docs/zh-hk/components/co-phpunit.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ Co-PHPUnit 讓 PHPUnit 測試在 Swoole 協程中運行,適用於測試依賴
composer require friendsofhyperf/co-phpunit --dev
```

組件依賴 `hyperf/coordinator` `~3.2.0`,並支援 PHPUnit 10、11 和 12。它沒有將 Swoole
擴展聲明為 Composer 依賴;未載入該擴展時,測試會回退到 PHPUnit 的普通執行方式。
組件依賴 `hyperf/coordinator` `~3.2.0`,並支持 PHPUnit 10、11 和 12。它沒有將 Swoole
擴展聲明為 Composer 依賴;未加載該擴展時,測試會回退到 PHPUnit 的普通執行方式。

## 使用

Expand Down Expand Up @@ -40,11 +40,11 @@ class ServiceTest extends TestCase
}
```

安裝組件後,不需要額外配置 PHPUnit 或 Composer 自動載入
安裝組件後,不需要額外配置 PHPUnit 或 Composer 自動加載

### 退出協程執行

將 `NonCoroutine` 應用於單個測試方法,可以讓該方法在不建立協程的情況下運行
將 `NonCoroutine` 應用於單個測試方法,可以讓該方法在不創建協程的情況下運行

```php
<?php
Expand Down Expand Up @@ -80,26 +80,26 @@ class ServiceTest extends TestCase

`RunTestsInCoroutine` 會重寫 PHPUnit 的 `runBare()` 方法。

每個測試開始前,遇到以下任一情況時,它不會建立協程,而是以普通方式運行測試:
每個測試開始前,遇到以下任一情況時,它不會創建協程,而是以普通方式運行測試:

- 未載入 Swoole 擴展;
- 未加載 Swoole 擴展;
- 當前已經位於 Swoole 協程中;
- 測試類帶有 `#[NonCoroutine]`;或
- 當前測試方法帶有 `#[NonCoroutine]`。

否則,它會調用 `Swoole\Coroutine\run()`,並在協程內執行 PHPUnit 父類的 `runBare()`。
異常會先被捕獲,並在協程退出後重新拋出。在 `finally` 區塊中,該 trait 會清除所有 Swoole
計時器,並恢復 Hyperf 的 `WORKER_EXIT` 協調器。僅當該 trait 建立協程時,才會執行這些
異常會先被捕獲,並在協程退出後重新拋出。在 `finally` 塊中,該 trait 會清除所有 Swoole
定時器,並恢復 Hyperf 的 `WORKER_EXIT` 協調器。僅當該 trait 創建協程時,才會執行這些
清理操作。

`#[NonCoroutine]` 只會阻止該 trait 建立協程。如果測試已經在協程內運行,該屬性不會讓測試
`#[NonCoroutine]` 只會阻止該 trait 創建協程。如果測試已經在協程內運行,該屬性不會讓測試
退出現有協程。

## PHPUnit 補丁

組件透過 Composer 的 `autoload.files` 註冊 `phpunit-patch.php`。載入 Composer 自動載入
文件時,該補丁會找到 PHPUnit 的 `TestCase` 原始碼文件;如果 `TestCase::runBare()` 帶有
組件通過 Composer 的 `autoload.files` 註冊 `phpunit-patch.php`。加載 Composer 自動加載
文件時,該補丁會找到 PHPUnit 的 `TestCase` 源文件;如果 `TestCase::runBare()` 帶有
`final` 關鍵字,則將其移除,以便 trait 重寫該方法。

該補丁會直接寫入已安裝的 PHPUnit 原始碼文件。需要應用補丁時,請確保 Composer 的 vendor
該補丁會直接寫入已安裝的 PHPUnit 源文件。需要應用補丁時,請確保 Composer 的 vendor
目錄可寫。
42 changes: 21 additions & 21 deletions docs/zh-hk/components/command-benchmark.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@ Hyperf 命令的基準測試組件,Fork 自
composer require friendsofhyperf/command-benchmark
```

該套件聲明依賴 Hyperf Collection、Command 和 Event `~3.2.0`。Hyperf 套件發現機制會載入其
該包聲明依賴 Hyperf Collection、Command 和 Event `~3.2.0`。Hyperf 包發現機制會加載其
`ConfigProvider`,並註冊組件的 AOP 切面。

## 使用

該切面會為繼承 `Hyperf\Command\Command` 的命令加入無需值的
`--enable-benchmark` 選項。呼叫命令時加入該選項即可
該切面會為繼承 `Hyperf\Command\Command` 的命令添加無需值的
`--enable-benchmark` 選項。調用命令時添加該選項即可

```shell
php bin/hyperf.php your:command --enable-benchmark
Expand All @@ -31,38 +31,38 @@ php bin/hyperf.php your:command --enable-benchmark

## 指標

- **TIME**:從命令建構函式返回後到其 `execute()` 方法返回的耗時。少於一秒時顯示為毫秒
少於 60 秒時顯示為秒,更長時間顯示為分鐘和秒。
- **MEM**:程序記憶體差值的報告值,以 MB 為單位並保留兩位小數。實作會用最終的
`memory_get_usage()` 值減去透過 `memory_get_usage(true)` 記錄的起始值;該值不是峰值記憶體
- **TIME**:從命令構造函數返回後到其 `execute()` 方法返回的耗時。小於一秒時顯示為毫秒
小於 60 秒時顯示為秒,更長時間顯示為分鐘和秒。
- **MEM**:進程內存差值的報告值,以 MB 為單位並保留兩位小數。實現會用最終的
`memory_get_usage()` 值減去通過 `memory_get_usage(true)` 記錄的起始值;該值不是峯值內存
也可能為負數。
- **SQL**:從命令建構函式返回後到輸出摘要前觀察到的
`Hyperf\Database\Events\QueryExecuted` 事件數量。監聽器會觀察程序內派發的所有此類事件
不僅限於可歸因於目前命令的查詢;未派發此類事件時為 `0`。
- **SQL**:從命令構造函數返回後到輸出摘要前觀察到的
`Hyperf\Database\Events\QueryExecuted` 事件數量。監聽器會觀察進程內派發的所有此類事件
不僅限於可歸因於當前命令的查詢;未派發此類事件時為 `0`。

每個命令在建構時都會開始收集指標,即使之後呼叫命令時沒有傳入
`--enable-benchmark`。因此,報告的區間可能包含命令建構完成至執行之間的工作,並不僅限於
每個命令在構造時都會開始收集指標,即使之後調用命令時沒有傳入
`--enable-benchmark`。因此,報告的區間可能包含命令構造完成至執行之間的工作,並不僅限於
`execute()` 方法體。

## 配置

組件不會發佈配置檔案。`FriendsOfHyperf\CommandBenchmark\ConfigProvider` 會自動註冊
`FriendsOfHyperf\CommandBenchmark\Aspect\CommandAspect`。如果停用了 Hyperf 套件發現機制
請確保載入該配置提供器
組件不會發布配置文件。`FriendsOfHyperf\CommandBenchmark\ConfigProvider` 會自動註冊
`FriendsOfHyperf\CommandBenchmark\Aspect\CommandAspect`。如果禁用了 Hyperf 包發現機制
請確保加載該配置提供器

組件沒有配置項或註解;其操作入口是 `--enable-benchmark` 命令選項。

## 注意事項

- 倉庫目前沒有該組件的專用測試。
- 指標收集和 SQL 事件監聽器會產生開銷,建議主要用於開發和診斷。無論之後是否使用該選項,
每個命令建構時都會收集指標並註冊監聽器
- 應將 `--enable-benchmark` 視為保留選項名稱;命令自行定義同名但不相容的選項會導致選項註冊失敗
- `hyperf/database` 不是該套件聲明的依賴;僅當應用程式派發其 `QueryExecuted` 事件時,SQL
指標才有意義
- SQL 指標統計已派發的 `QueryExecuted` 事件,不會直接檢查資料庫連線
每個命令構造時都會收集指標並註冊監聽器
- 應將 `--enable-benchmark` 視為保留選項名;命令自行定義同名但不兼容的選項會導致選項註冊失敗
- `hyperf/database` 不是該包聲明的依賴;僅當應用派發其 `QueryExecuted` 事件時,SQL 指標
才有意義
- SQL 指標統計已派發的 `QueryExecuted` 事件,不會直接檢查數據庫連接

## 聯絡方式
## 聯繫方式

- [Twitter](https://twitter.com/huangdijia)
- [Gmail](mailto:huangdijia@gmail.com)
Loading
Loading