本文目录导读:

在 PHP 中实现“VCR 录制”通常指的是记录和重放 HTTP 请求(类似于 Ruby 的 VCR 库),或者指录制浏览器/桌面操作(如自动化测试)。
由于你的问题比较宽泛,我假设你是指前者(HTTP 模拟测试),这是 PHP 开发中最常见的“VCR”场景,如果是后者(屏幕录制),我会在最后补充说明。
PHP 测试中的“VCR”模式(HTTP 录制/回放)
这种模式用于单元测试,避免每次测试都真实调用外部 API,从而加快测试速度并保证测试的确定性。
核心库:php-vcr/php-vcr
这是 PHP 中最流行的 VCR 库,可以录制 HTTP 交互并将其存储为“磁带”(cassette)文件,然后在后续测试中回放。
安装
composer require --dev php-vcr/php-vcr
基本配置(在测试初始化中)
<?php
// tests/bootstrap.php 或在 PHPUnit 的 setUp() 中
use VCR\VCR;
// 配置存储目录(磁带文件存放位置)
VCR::configure()
->setCassettePath('tests/fixtures/vcr') // 存放 .json 磁带文件
->setStorage('json')
->setMode('once'); // once: 如果磁带存在就回放,不存在则录制并存储
// 注意:php-vcr 需要启用特定的扩展或使用 curl 中间件
录制与回放示例
<?php
use VCR\VCR;
use PHPUnit\Framework\TestCase;
class MyApiTest extends TestCase
{
public function testUserApi()
{
// 插入磁带(如果不存在则录制,存在则重放)
VCR::insertCassette('user_profile');
// 你的业务代码(会自动被 VCR 拦截并记录)
$response = file_get_contents('https://api.example.com/user/123');
$this->assertStringContainsString('"name": "John"', $response);
// 结束录制
VCR::eject();
}
}
高级配置(过滤请求头、URL 编码等)
VCR::configure()
->setMode('new_episodes') // 允许新增请求记录
->setWhiteList(['http://my-internal-service.com']) // 白名单(不拦截)
->setBlackList(['http://very-secret.com'])
->setRequestMatchers(['method', 'url', 'host']);
录制浏览器/屏幕操作(如自动化测试)
如果你指的是录制“用户在浏览器中的操作”(例如用于 Selenium 自动化测试),则使用 php-webdriver 或 Panther。
使用 Panther(Symfony 组件)模拟 VCR 录制操作:
<?php
use Symfony\Component\Panther\PantherTestCase;
class E2ETest extends PantherTestCase
{
public function testRecordActions()
{
// 1. 启动浏览器
$client = self::createPantherClient();
// 2. 录制操作(实际上就是执行)
$client->request('GET', '/login');
$client->submitForm('Login', ['username' => 'admin', 'password' => '123']);
$client->clickLink('Dashboard');
// 3. 验证结果
$this->assertSelectorTextContains('h1', 'Welcome');
}
}
注意:Panther 本身不提供回放“录制好的操作”,它是直接执行测试脚本,如果你需要“录制脚本保存文件”,需要结合 chromedriver 的截图或日志功能。
视频录制(如果真的是录屏)
如果你指在 PHP 服务器端录制视频流,这通常需要调用系统命令(如 ffmpeg)。
<?php
// 使用 exec 调用 ffmpeg 录屏(Linux 环境)
$outputFile = '/tmp/screen_' . time() . '.mp4';
exec("ffmpeg -f x11grab -i :0.0 -t 10 {$outputFile} 2>&1", $result, $status);
if ($status === 0) {
echo "录制成功: {$outputFile}";
} else {
echo "录制失败: " . implode("\n", $result);
}
| 场景 | 推荐方案 | 典型用途 |
|---|---|---|
| HTTP 请求模拟 | php-vcr/php-vcr |
单元测试中伪造外部 API 响应 |
| 浏览器操作录制 | symfony/panther |
E2E 测试录制交互步骤 |
| 真实录屏 | 调用 ffmpeg 系统命令 |
后台任务录制视频 |
核心建议:
如果你是为了测试,推荐 php-vcr/php-vcr,它的核心概念就是“录制一次,永久复用”,专门解决外部依赖的稳定性。
如果上述都不符合你的需求,请补充说明:
- 你是在开发测试,还是运维录屏?
- 你需要录制HTTP请求还是用户界面操作?