celerrate/celerrate
GitHub: celerrate/celerrate
Celerrate 是一款用 Rust 实现的极速 PHP 多合一工具链,旨在以增量语义引擎为核心,为 PHP 项目提供高性能的静态分析、格式化、LSP 及自动化重构能力。
Stars: 0 | Forks: 0
# Celerrate
[](https://github.com/celerrate/celerrate/actions/workflows/ci.yml)
[](https://github.com/celerrate/celerrate/releases/latest)
[](https://github.com/celerrate/celerrate/releases/latest)
[](#license)
**一款极其快速、多合一的 PHP 工具链,使用 Rust 编写。**
Celerrate 在 1.533 秒内完成对 130 万行 PHP 代码的冷启动类型检查,
并在你修改函数体后,仅需 0.521 秒即可完成检查。
该数据为端到端测量结果,测量协议已提交至代码库中。
## 快速开始
从[最新发布版本](https://github.com/celerrate/celerrate/releases/latest)下载适用于你平台的压缩包,
解压后,在 Composer 项目中运行二进制文件:
```
celerrate check .
```
无需任何配置。Composer 发现机制会自动找到你的代码、
依赖项以及所使用的 PHP 版本范围:
```
src/Service/Search.php:27:16 CEL0021 `array_find` requires PHP 8.4, but the project's minimum PHP version is 8.1
src/Controller/PostController.php:42:19 CEL0018 unknown class `App\Service\Mailer`
src/Notification/Mailer.php:31:9 CEL0034 accessing `format` on a possibly null `DateTimeImmutable|null`
0 notices, 3 diagnostics
```
## 性能表现
数据基于已提交的[基准测试协议](benchmarks/PROTOCOL.md)
在 symfony/demo(9447 个 PHP 文件,130 万行代码,包含 vendor 目录)上测得,
开启类型推断,并运行于协议指定的硬件上:
| 场景 | 中位挂钟时间 |
| --- | --- |
| 冷启动全量分析 | 1.533 s |
| 热启动,修改单个函数体 | **0.521 s** |
| 热启动,修改单个签名 | 0.471 s |
所有数据均为完整的 CLI 运行时间:包括进程启动、缓存加载、
分析和报告生成。在该规模下未发布与其他工具的对比结果;
协议中说明了具体原因。
## 目前支持的功能
`celerrate check .` 会报告五类诊断信息
([标识符参考](docs/diagnostics.md)):
- **未知符号**:引用了无法解析的类、函数或常量,
此项检查会综合考量你的项目、Composer 依赖以及内置的 PHP stubs。
- **PHP 版本限制**:使用了不在 `composer.json` 声明的
PHP 版本范围内的符号或语法,包括已移除和已弃用的内容。
- **未知成员**:在接收者的推断类型上不存在的方法、
属性、类常量和 enum cases,对动态内容保持静默,
能够识别 `__call`/`__get` 和 `@property`/`@method` docblocks。
- **空值特性(Nullability)**:解引用可能为 `null` 的值,
通过流 narrowing(`instanceof`、`isset()`、`??`、`?->` 链、
`match`、提前返回、断言注解)来决定在每个使用点是否仍可为空。
- **参数类型**:针对每个参数的可赋值性和参数数量检查,
支持命名参数,并遵循每个文件的 `declare(strict_types)` 模式。
其他相关功能:
- **遵循你的注解**:支持标准 PHPDoc、PHPStan 变体
以及 Psalm 同义词,通过内置的
[PHPDoc bridge](docs/phpdoc-bridge.md)实现,包括内联
抑制规则(`@phpstan-ignore-line`、`@psalm-suppress` 等)。
- **过程间推断**:声明的类型会被信任,
未加注解的返回类型会在整个调用图中进行推断,
泛型会为了精确度而被解析(但绝不会对泛型本身报错)。
- **零配置**:Composer 发现机制会自动推导需要分析的内容
以及检查时所依据的 PHP 版本。已安装的依赖会被索引,但绝不会对其报错。
- **`--watch`**:在每次文件更改时重新分析。
- **持久化缓存**(`.celerrate/cache/`,自动忽略自身):热启动
运行会跨进程复用所有未发生更改的内容,包括推断出的类型。
### 尚未支持的功能
尚无 lint 规则、格式化工具、语言服务器、配置
文件、基准(baseline),除终端报告外也无其他输出格式。
不报告泛型不匹配(泛型仅用于提升精度),
未加注解的参数会被视为 `mixed`。这些是接下来规划的
子项目,将按[路线图](#roadmap)中的顺序推进。
## 单引擎,全工具链
每一条 Celerrate 命令都是对同一个增量语义模型的视图。
只需索引项目一次;其他所有操作都是查询:
- **`celerrate check`**:具备过程间类型推断的静态分析,
以及 lint、安全污点和架构规则组。
一条命令即可回答“我的代码没问题吗?”。
- **`celerrate format`**:一款具有坚定主见、无损的格式化工具。
- **`celerrate lsp`**:提供与 CI 相同诊断功能的语言服务器,
且响应速度与你的打字速度同步。
- **`celerrate migrate` / `celerrate generate`**:自动化重构
和语义化代码生成。
速度始终是其一大特色:Rust 核心,默认并行,
设计上即为增量式。诊断旨在提供指导:包含带有注解的
代码跨度、引擎的推理过程、具体的建议以及安全的自动
修复。可扩展性是设计之初就考虑到的:支持使用 Rust 编写的第一方插件,
以及通过沙箱化的 WASM API 接入的社区插件。
## 值得信赖的设计
这些数字背后的工程规则在 CI 中受到严格的机械化约束:
- **零 panic**:clippy 在整个工作区内禁止使用 `unwrap`、`expect`、索引操作和
`panic`;全面禁用 `unsafe` 代码。
- **任何输入都无法使其崩溃**:解析器和加载器只会产生诊断信息,
绝不会引发失败。模糊测试(Fuzzing)确保它们不出差错。
- **确定性**:每一项分析结果都是其输入的纯函数。
输入相同,在任何机器上的输出也必然相同。
- **设计上的增量式**:失效部分是精确计算得出的,绝非
臆测;热启动运行会复用所有未更改的内容。
- **测量而非自夸**:性能数据均来源于已提交的、
可复现的基准测试协议。
- **测试驱动**:没有测试需求,就没有生产代码。
## 兼容性
Celerrate 面向 PHP 8.1+ 项目。它定义了自己的类型注解
规范,并提供第一方的 [PHPDoc bridge](docs/phpdoc-bridge.md),
该 bridge 默认开启,确保现有的带注解代码库在第一天就能正常运行。
## 路线图
每次专注一个核心支柱,按以下顺序推进:
1. **`celerrate check`**:静态分析引擎是首个
公开交付成果(自 v0.0.1 起预览,自
v0.0.3 起具备类型感知能力);lint、污点和架构规则组均构建于其上。
2. **`celerrate format`**:格式化工具,待无损语法树
经分析器验证后推出。
3. **`celerrate lsp`**:语言服务器,复用同一个
增量引擎。
4. **`celerrate migrate` / `celerrate generate`**:重构和代码
生成,放在最后是因为它们依赖于上述所有功能。
## 许可证
采用以下双重许可之一:
- MIT 许可证 ([LICENSE-MIT](LICENSE-MIT))
- Apache 许可证,版本 2.0 ([LICENSE-APACHE](LICENSE-APACHE))
由你自行选择。“Celerrate”是 JDevelop 的商标。
### 贡献
除非你明确声明,否则根据 Apache-2.0 许可证的规定,你出于包含在此作品中的目的而
有意提交的任何贡献,均应按上述方式进行双重许可,不附加任何
额外的条款或条件。
标签:LSP, OpenVAS, PHP, Rust, 云安全监控, 可视化界面, 开发工具链, 网络流量审计, 通知系统, 静态分析