
# CLI

```bash
vendor/bin/storh stats <root> [collection] [doc|log|queue]
vendor/bin/storh verify <root> [collection] [doc|log|queue]
vendor/bin/storh compact <root> [collection] [doc|log]
vendor/bin/storh reindex <root> [collection]
```

`<root>` 是引擎打开时使用的存储根目录，也就是 `StorageRoot::resolve()` 返回的路径：基目录加上命名空间。在 `StorageRoot::resolve(__DIR__ . '/var/storh', 'app')` 下打开的存储位于 `var/storh/app` 下：

```bash
vendor/bin/storh stats var/storh/app pages doc
vendor/bin/storh verify var/storh/app events log
vendor/bin/storh compact var/storh/app events log
vendor/bin/storh reindex var/storh/app pages
```

仅传入基目录（`var/storh`）时，命令会指向尚不存在的集合，因此会报告集合为空，而不是报错。

当 storh 作为依赖安装时，`vendor/bin/storh` 需要使用 storh 0.5.2 或更高版本。早期版本只会查找软件包自身 `vendor/` 目录中的 Composer 自动加载器，因此会报 `require` 错误。

CLI 会输出稳定的 JSON，因此可用于 cron 任务和部署健康检查。集合默认为 `default`；对于 `stats`、`verify` 和 `reindex`，引擎默认为 `doc`；对于 `compact`，则默认为 `log`。

## 命令所调用的维护方法

所有引擎都提供 CLI 调用的维护方法：

```php
$store->stats();
$store->health();
$store->verify();
$store->repair();
```

DocStore 还提供：

```php
$docs->reindex();
$docs->compact(); // no-op report for API symmetry
```

SegmentedLog 还提供：

```php
$log->compact();
$log->recover();
$log->state_index();
```

对于 DocStore，`verify()` 会检查记录是否能正确解析，并验证等值、范围和复合索引是否与完整记录扫描结果一致。`repair()` 会将损坏的记录文件隔离到 `.storh/corrupt/` 下，并根据有效记录重建索引。

对于 SegmentedLog，`verify()` 会解码分段行，并将当前派生状态索引与新执行的分段重放结果进行比较。`repair()` 会重建派生状态，并截断末尾不完整的行。

对于 Queue，`verify()` 会解码每个持久化事件，并将待处理、处理中、已完成、负载和认领顺序状态与新执行的 `queue.log` 重放结果进行比较。`repair()` 会从日志重建队列状态，并将超时的处理任务重新入队。
