跳转到主要内容

简介

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日