rdebug / midi
Rdebug 的 PHP 重放客户端
Requires
- ext-dom: *
- ext-json: *
- apache/thrift: ^0.12.0
- clue/redis-protocol: ^0.3.1
- guzzlehttp/guzzle: ^6.3
- lisachenko/protocol-fcgi: ^1.1
- phpunit/php-code-coverage: 5.3.2
- pimple/pimple: ^3.2
- symfony/console: ^3.3
- symfony/event-dispatcher: ^3.3
- symfony/finder: ^3.3
- symfony/process: ^3.3
- symfony/stopwatch: ^3.3
- symfony/yaml: ^3.3
- twig/twig: ^2.0
- vaimo/composer-patches: 3.23.1
Requires (Dev)
- phpunit/phpunit: ^6.5
README
翻译
1. 简介
Rdebug 是一个开源的 工具链,专注于提高开发者在日常开发、测试和调试过程中的效率。代码将更加健壮。
1.1 背景
随着微服务架构使得服务 异构化、易于部署 和 高度可扩展,大型系统被分解成几个微服务。
但是,微服务架构并非万能。它存在一些缺点。一个服务被分割成几个小服务后,测试环境难以维护。单元测试需要模拟下游服务。这将降低开发效率,并增加生产环境中的错误。
我们相信这个行业需要进化。
1.2 原则
提高效率,缩短发布周期,提高代码质量,减少生产错误
1.3 何时使用
适合于已经记录了流量的旧 API 重构。
不适用于新 API 或未记录流量的 API。
正在调查对新的 API 的支持。
2. 快速开始
流量记录
# Modify php-fpm config, set `clear_env = no` # Compile koala-libc.so & koala-recorder.so # Start php-fpm with koala-libc.so & koala-recorder.so # Set environment first $ export KOALA_SO=/path/to/koala-recorder.so $ export KOALA_RECORD_TO_DIR=/path/to/your-save-recorded-session-dir $ export LC_CTYPE="C" # Recording # macOS $ DYLD_INSERT_LIBRARIES="/path/to/koala-libc.so" DYLD_FORCE_FLAT_NAMESPACE="y" /path/to/sbin/php-fpm # or, Linux $ LD_PRELOAD="/path/to/koala-libc.so" /path/to/sbin/php-fpm
流量回放
三种回放方式:从源回放,通过 midi.phar 回放,通过 composer vendor/bin 回放。
# Source $ git clone https://github.com/didi/rdebug.git $ cd rdebug/php/midi $ sh install.sh $ cd /path/to/your/project $ /path/to/rdebug/php/midi/bin/midi run -f RECORD-SESSION-FILE # Or, Phar $ wget -O midi.phar -q https://github.com/didi/rdebug/raw/master/output/bin/midi.phar $ midi.phar run -f RECORD-SESSION-FILE # Or, Composer global $ composer global require rdebug/midi $ cd /path/to/your/project $ ~/.composer/vendor/bin/midi run -f RECORD-SESSION-FILE # Or, Composer $ cd /path/to/your/project $ composer require rdebug/midi --dev $ ./vendor/bin/midi run -f RECORD-SESSION-FILE
PHP 示例
3. 技术细节
我们使用实际生产流量在非生产环境中进行测试。因此,Rdebug 的核心功能是流量记录和流量回放。
-
流量记录
记录生产流量,包括微服务之间的 RPC。最难的部分是跟踪将跨越多个服务的请求。
-
流量回放
将记录的生产流量回放到非生产环境,基于流量匹配模拟下游流量。最难的部分是拦截和流量匹配。
3.1 Koala & Koala-libc
Koala 和 Koala-libc 是 Rdebug 的引擎。
因为像 RPC 跟踪、libc 拦截 这样的流量回放系统可能关心的问题,也是一个流量记录系统关心的问题。流量记录和回放系统共享同一个引擎。
Koala
Koala 使用 Go 语言编写,Koala-libc 包含一些用于拦截部分的 C++ 代码,这些代码将被编译成 koala-recorder.so 和 koala-replayer.so
Koala 支持单独以及同时进行回放和记录。
更多详情: koala 。
Koala-libc
koala-libc 使用 C 语言编写,并编译成 koala-libc.so
Go 语言不支持 fork
。为了避免 PHP-FPM fork 工作进程带来的问题,您需要将 koala-libc.so 注入 PHP 的父进程。这样,当在子进程中进行 accept
时,koala-libc.so 将将 libc 拦截的请求转发到 *koala-recorder.so
更多详情: koala-libc 。
3.2 Midi
Midi 是一个用 PHP 编写的命令行流量回放客户端,用于 PHP。
koala-replayer.so 被嵌入到 Midi 中,它可以针对新代码回放生产流量,分析测试结果,生成差异报告,跟踪报告,覆盖率报告。
Midi 支持 Xdebug。
更多信息: midi。
4. 编译
4.1 需求
Koala & Koala-libc
- GCC >= 4.8
- Go >= 1.8
- Glide
Midi
- macOS/Linux
- PHP >= 7.0
- Xdebug(可选)
- Composer(可选)
4.2 编译 Koala-libc
$ cd koala-libc
$ sh build.sh
将生成 ../output/libs/koala-libc.so
。
4.3 编译 Koala
$ cd koala # install depends $ sh build.sh vendor # koala-recorder.so $ sh build.sh recorder # koala-replayer.so $ sh build.sh
将生成 ../output/libs/koala-recorder.so
和 ../output/libs/koala-replayer.so
。
4.4 编译 midi.phar
在编译 midi.pahr 之前,建议在您的系统中编译 koala-replayer.so
并存储在 php/midi/res/replayer
目录中。
仓库中的 php/midi/res/replayer/koala-replayer.so
适用于 macOS。
$ cd php/midi
$ sh build.sh
将生成 ../output/bin/midi.phar
默认 phar 不会包含 DiPlugin
插件,这是 didi 的内部插件。
如果您想使用 DiPlugin
插件进行编译
$ cd php/midi
$ sh build.sh midi-diplugin
5. 使用方法
5.1 流量记录
将流量记录到文件或 Elastic。
设置环境变量 KOALA_RECORD_TO_DIR
以将记录保存到指定目录
注入 so。在 macOS 中使用 DYLD_INSERT_LIBRARIES
或在 Linux 中使用 LD_PRELOAD
更多信息: Recorder。
5.1.1 macOS 记录
$ DYLD_INSERT_LIBRARIES="/path/to/koala-libc.so:/usr/lib/libcurl.dylib" DYLD_FORCE_FLAT_NAMESPACE="y" LC_CTYPE="C" KOALA_SO=/path/to/koala-recorder.so KOALA_RECORD_TO_DIR=/tmp /usr/local/sbin/php-fpm
5.1.2 Linux 记录
LD_PRELOAD="/path/to/koala-libc.so /usr/lib64/libcurl.so.4" LC_CTYPE="C" KOALA_SO="/path/to/koala-recorder.so" KOALA_RECORD_TO_DIR=/tmp /usr/local/sbin/php-fpm
Koala 通过将 KOALA_RECORD_TO_DIR
替换为 KOALA_RECORD_TO_ES
支持将记录写入 Elastic,其中值是 Elastic 写入 URL
5.2 流量回放
流量回放是将记录的流量在生产环境中回放到非生产环境。您只需要部署代码,而无需部署下游服务。
以下是一个使用 '-f' 进行回放的简单示例,该选项指定要回放的文件。
5.2.1 回放
# Source $ /path/to/rdebug/php/midi/bin/midi run -f RECORD-SESSION-FILE # Or, phar $ midi.phar run -f RECORD-SESSION-FILE # Or, composer vendor bin $ ./vendor/bin/midi -f RECORD-SESSION-FILE
更多信息: 回放
使用 -v, -vv 或 -vvv 以获取更多详细日志。
5.2.2 报告
使用 -R
,-T
,-C
生成:回放报告、跟踪报告、覆盖率报告
更多信息: Midi。
6. 更多
6.1 翻译
6.2 文档
6.3 贡献
欢迎任何贡献。 更多信息
6.4 合同
- 添加微信
- QQ 群
6.5 许可证
Rdebug 根据 Apache 2.0 许可证授权。 LICENSE
6.6 贡献者
特别感谢 TaoWen 开发了 Koala & Koala-libc。
感谢所有贡献者。 更多信息