过程组件
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 3.0,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
过程组件
Process组件在子进程中执行命令。
安装
你可以用两种不同的方式安装组件:
- 通过Composer安装(
ob娱乐下载symfony /过程
在Packagist); - 使用官方Git存储库(https://github.com/ob娱乐下载symfony/process).
然后,要求供应商/ autoload.php
文件以启用Composer提供的自动加载机制。否则,您的应用程序将无法找到这个Symfony组件的类。ob娱乐下载
使用
的过程类允许你在子进程中执行命令:
12 3 4 5 6 7 8 9 10 11 12
使用ob娱乐下载\组件\过程\过程;使用ob娱乐下载\组件\过程\异常\ProcessFailedException;$过程=新过程(ls lsa的);$过程->run ();//在命令完成后执行如果(!$过程->isSuccessful ()) {扔新ProcessFailedException ($过程);}回声$过程->getOutput ();
在执行命令时,该组件负责处理不同平台之间的细微差异。
的getOutput ()
方法总是返回命令和标准输出的全部内容getErrorOutput ()
错误输出的内容。或者,getIncrementalOutput ()而且getIncrementalErrorOutput ()方法返回自上次调用以来的新输出。
的clearOutput ()方法清除输出和的内容clearErrorOutput ()清除错误输出的内容。
的mustRun ()
方法与run ()
,除了它会抛出一个ProcessFailedException如果进程不能成功执行(即进程以非零代码退出):
12 3 4 5 6 7 8 9 10 11 12
使用ob娱乐下载\组件\过程\异常\ProcessFailedException;使用ob娱乐下载\组件\过程\过程;$过程=新过程(ls lsa的);试一试{$过程->mustRun ();回声$过程->getOutput ();}抓(ProcessFailedException$e){回声$e->getMessage ();}
获得实时流程输出
在执行长时间运行的命令时(如将文件rsync到远程服务器),可以通过将匿名函数传递给最终用户实时反馈run ()方法:
1 2 3 4 5 6 7 8 9 10
使用ob娱乐下载\组件\过程\过程;$过程=新过程(ls lsa的);$过程->运行(函数($类型,$缓冲){如果(过程::呃= = =$类型){回声' err > '.$缓冲;}其他的{回声' out > '.$缓冲;}});
异步运行进程
您还可以启动子进程,然后让它异步运行,在需要时检索主进程中的输出和状态。使用start ()方法来启动异步进程正在()方法检查进程是否已完成getOutput ()方法获取输出:
1 2 3 4 5 6 7 8
$过程=新过程(ls lsa的);$过程->开始();而($过程->正在()){//等待进程结束}回声$过程->getOutput ();
你也可以等待一个进程结束,如果你异步启动它,并完成了其他事情:
12 3 4 5 6 7 8 9 10 11 12
$过程=新过程(ls lsa的);$过程->开始();/ /……做其他事情$过程->等待(函数($类型,$缓冲){如果(过程::呃= = =$类型){回声' err > '.$缓冲;}其他的{回声' out > '.$缓冲;}});
请注意
的wait ()方法正在阻塞,这意味着您的代码将在这一行停止,直到外部进程完成。
停止进程
方法可以在任何时候停止任何异步进程stop ()方法。这个方法有两个参数:一个超时和一个信号。一旦超时,信号就被发送到正在运行的进程。发送给进程的默认信号是SIGKILL
.请细阅信号文档如下欧宝官网下载app以了解更多关于Process组件中信号处理的信息:
1 2 3 4 5 6
$过程=新过程(ls lsa的);$过程->开始();/ /……做其他事情$过程->停止(3.、信号情报);
单独执行PHP代码
如果要单独执行某些PHP代码,请使用PhpProcess
而不是:
1 2 3 4 5 6 7
使用ob娱乐下载\组件\过程\PhpProcess;$过程=新PhpProcess (< < < EOF < ?php echo 'Hello World';? > EOF);$过程->run ();
为了使代码在所有平台上都能更好地工作,可能需要使用ProcessBuilder类:
1 2 3 4
使用ob娱乐下载\组件\过程\ProcessBuilder;$构建器=新ProcessBuilder (数组(“ls”,“文理学院”));$构建器->getProcess ()->run ();
如果您正在构建二进制驱动程序,则可以使用setPrefix ()方法来添加所有生成的进程命令的前缀。
下面的例子将为tar二进制适配器生成两个进程命令:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
使用ob娱乐下载\组件\过程\ProcessBuilder;$构建器=新ProcessBuilder ();$构建器->setPrefix (“/ usr / bin /焦油”);/ /“/ usr / bin /焦油”“列表——”“——文件= archive.tar.gz”回声$构建器->setArguments (数组(“——列表”,“——文件= archive.tar.gz”))->getProcess ()->getCommandLine ();// '/usr/bin/tar' '-xzf' 'archive.tar.gz'回声$构建器->setArguments (数组(“-xzf”,“archive.tar.gz”))->getProcess ()->getCommandLine ();
过程超时
您可以通过设置超时(以秒为单位)来限制进程完成所需的时间:
1 2 3 4 5
使用ob娱乐下载\组件\过程\过程;$过程=新过程(ls lsa的);$过程->setTimeout (3600);$过程->run ();
如果达到超时,则aRuntimeException抛出。
对于长时间运行的命令,你有责任定期执行超时检查:
1 2 3 4 5 6 7 8 9 10 11
$过程->setTimeout (3600);$过程->开始();而($条件){/ /……//检查是否超时$过程->checkTimeout ();usleep (200000);}
进程空闲超时
与上一段的超时相反,空闲超时只考虑从进程产生最后一个输出到现在的时间:
1 2 3 4 5 6
使用ob娱乐下载\组件\过程\过程;$过程=新过程(“something-with-variable-runtime”);$过程->setTimeout (3600);$过程->setIdleTimeout (60);$过程->run ();
在上面的例子中,当总运行时超过3600秒,或者进程在60秒内没有产生任何输出时,进程就被认为超时了。
过程的信号
方法向程序发送POSIX信号信号()方法:
1 2 3 4 5 6 7
使用ob娱乐下载\组件\过程\过程;$过程=新过程(find / name "rabbit");$过程->开始();//将向进程发送一个SIGKILL$过程->信号(SIGKILL);
谨慎
由于PHP中的一些限制,如果在Process组件中使用信号,可能必须在命令前加上执行.请阅读ob娱乐下载Symfony的问题# 5759而且PHP错误# 39992来理解为什么会发生这种情况。
POSIX信号在Windows平台上不可用,请参阅PHP文欧宝官网下载app档可用信号。
过程Pid
您可以访问pid属性的正在运行进程的getPid ()方法。
1 2 3 4 5 6
使用ob娱乐下载\组件\过程\过程;$过程=新过程(“/ usr / bin / php worker.php”);$过程->开始();$pid=$过程->getPid ();
谨慎
由于PHP中的一些限制,如果您想获得symfony进程的pid,您可能必须在命令前加上ob娱乐下载执行.请阅读ob娱乐下载Symfony的问题# 5759来理解为什么会发生这种情况。
禁用输出
由于标准输出和错误输出总是从底层进程中获取,因此在某些情况下禁用输出以节省内存可能很方便。使用disableOutput ()而且enableOutput ()切换此功能:
1 2 3 4 5
使用ob娱乐下载\组件\过程\过程;$过程=新过程(“/ usr / bin / php worker.php”);$过程->disableOutput ();$过程->run ();
谨慎
您不能在流程运行时启用或禁用输出。
如果禁用输出,则无法访问getOutput
,getIncrementalOutput
,getErrorOutput
或getIncrementalErrorOutput
.类的回调函数也不能传递开始
,运行
或mustRun
方法或用途setIdleTimeout
.