Skip to main content

简介

Laravel 的 Process Facade 是对 Symfony Process 组件的一层轻量封装。 它为在 Laravel 应用中调用 shell 命令、处理执行结果提供了简洁的 API。

启动进程

Process::run() 用于同步执行命令并获取结果。
ProcessResult 实例提供了一系列检查结果的方法。

失败时抛出异常

要在退出码大于 0 时抛出 Illuminate\Process\Exceptions\ProcessFailedException,可以使用 throw() 或 throwIf()。

进程选项

工作目录

用 path() 指定工作目录,省略时会使用当前 PHP 脚本的工作目录。

标准输入

input() 可以将数据写入进程的标准输入。

超时

默认超时是 60 秒,可以通过 timeout() 修改。超时后进程会被中断并抛出 ProcessTimedOutException。
也可以使用 CarbonInterval 相关辅助函数。
若要关闭超时,可以使用 forever()。
还可以设置空闲超时(一段时间没有输出即视为超时)。

环境变量

env() 可以新增或覆盖环境变量。系统环境变量会自动继承。
若要排除继承的变量,可以将其设为 false。

关闭输出

如果不需要大量输出,可以用 quietly() 节省内存。

实时输出

给 run() 的第二个参数传入闭包,即可实时接收输出。

管道

使用 Process::pipe() 可以把一条命令的输出作为下一条命令的输入。
也可以传入命令字符串数组。
给每个进程用 as() 打上 key,就能在输出闭包中判断输出来自哪个进程。

异步进程

Process::start() 可以异步启动进程。进程运行期间,应用可以继续处理其他工作。

进程 ID 与信号

id() 用来获取运行中进程的 OS 进程 ID。
signal() 可以向进程发送信号。

异步进程的输出

运行过程中通过 latestOutput() 与 latestErrorOutput() 可以获取自上次取用以来的增量输出。
要等某段输出出现再继续,可以使用 waitUntil()。

异步进程的超时检查

在循环中调用 ensureNotTimedOut(),如果已经超时就会抛出异常。

并发进程

使用 Process::pool() 可以并发执行多个进程。
使用 concurrently() 可以一行完成“启动池并等待结果”。

给进程命名

通过 as() 给每个进程加上字符串 key,可以更清晰地取得结果。
也可以向整个池发送信号。

测试

伪造进程

Process::fake() 可以在不真正执行 shell 命令的情况下测试。
也可以指定输出和退出码。

伪造特定命令

可以以通配符或命令字符串作为 key 分别配置。

序列化的假响应

同一条命令被多次调用时,可以按顺序指定返回结果。

断言

阻止意外进程

调用 Process::preventStrayProcesses() 后,如果执行了未 fake 的命令,就会抛出异常。

相关页面

Artisan 控制台

创建自定义命令并从中调用进程

队列

与异步处理的对比
最后修改于 2026年7月18日