Symfony Process 组件用于在PHP中安全、可控地执行外部命令,提供进程生命周期管理、超时控制、输出捕获和错误处理,支持数组传参防注入、多环境配置及同步/异步执行模式。

Symfony Process 组件用来在 PHP 中安全、可控地执行外部命令,比如 ls、php artisan migrate 或自定义脚本。它不是简单调用 exec(),而是封装了进程生命周期、超时控制、输出捕获和错误处理,适合 CLI 工具、后台任务或系统集成场景。
安装与基础运行
通过 Composer 安装即可独立使用:
composer require symfony/process
最简示例:执行 date 命令并获取结果
use Symfony\Component\Process\Process;
$process = new Process(['date']);
$process->run();
if ($process->isSuccessful()) {
echo $process->getOutput(); // 如:Mon May 12 01:48:00 CST 2026
}
传参、环境与工作目录
构造 Process 实例时可完整配置运行上下文:
- 命令数组:每个元素为独立参数(避免 shell 注入),如
['php', 'script.php', '--force'] - 工作目录:第二个参数指定,如
__DIR__.'/bin',影响相对路径解析 - 环境变量:第三个参数是关联数组,如
['APP_ENV' => 'test', 'LANG' => 'en_US.UTF-8'] - 输入内容:第四个参数用于向进程 stdin 写入数据(如密码或 JSON 输入)
- 超时时间:第五个参数单位为秒,默认 60 秒;设为
null表示不限时(不推荐)
同步、异步与错误处理
根据使用场景选择执行方式:
-
run():阻塞等待完成,适合短任务、需立即读取结果的场景 -
start():非阻塞启动,配合wait()或轮询isRunning()实现后台控制 -
mustRun():成功则继续,失败直接抛出ProcessFailedException,适合关键步骤
错误输出要单独获取:$process->getErrorOutput(),标准输出和错误流是分离的。建议始终检查 isSuccessful() 或捕获异常,而不是只看返回值。
实用技巧与避坑点
真实项目中常遇到这些情况:
- Linux 后台运行:用
nohup+&时,务必加> /dev/null 2>&1避免句柄占用;更稳妥的做法是用start()+detach() - Windows 兼容:避免直接拼接字符串命令;统一用数组形式,如
['cmd', '/C', 'echo', 'hello'] - 大输出处理:对长时间或高输出量命令,用
setTimeout(300)和setIdleTimeout(60)防止卡死 - 权限问题:确保 PHP 进程有执行目标命令的权限,特别是调用
chmod、git或数据库客户端时


















