简介
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::assertRan('command') | 断言命令被执行 |
Process::assertNotRan('command') | 断言命令未被执行 |
Process::assertRan(fn) | 通过闭包做更细致的校验 |
Process::assertRanTimes('command', 3) | 断言命令被执行了指定次数 |
阻止意外进程
调用Process::preventStrayProcesses() 后,如果执行了未 fake 的命令,就会抛出异常。
相关页面
Artisan 控制台
创建自定义命令并从中调用进程
队列
与异步处理的对比