流程组件
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.5,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
流程组件
在子过程中流程组件执行命令。
安装
您可以安装组件在两个不同的方面:
- 安装它通过作曲家(
ob娱乐下载symfony /过程
在Packagist); - 使用官方的Git存储库(https://github.com/ob娱乐下载symfony/Process)。
使用
的过程类允许您执行一个命令子流程:
1 2 3 4 5 6 7 8 9 10 11
使用ob娱乐下载\组件\过程\过程;美元过程=新过程(ls lsa的);美元过程- >run ();/ /命令完成后执行如果(!美元过程- >isSuccessful ()) {扔新\ RuntimeException (美元过程- >getErrorOutput ());}回声美元过程- >getOutput ();
组件负责不同的平台之间的细微差别,当执行该命令。
的getOutput ()
方法总是返回命令的标准输出的整个内容getErrorOutput ()
错误输出的内容。或者,getIncrementalOutput ()和getIncrementalErrorOutput ()方法返回新的输出自上次电话。
2.4
的clearOutput ()
和clearErrorOutput ()
方法在Symfony 2.4中引入的。ob娱乐下载
的clearOutput ()清除输出的内容和方法clearErrorOutput ()清除错误输出的内容。
2.5
的mustRun ()
方法是在Symfony 2.5中引入的。ob娱乐下载
的mustRun ()
方法是相同的run ()
,除了它将抛出一个ProcessFailedException如果进程无法成功执行(即过程与一个非零退出代码):
1 2 3 4 5 6 7 8 9 10 11 12
使用ob娱乐下载\组件\过程\异常\ProcessFailedException;使用ob娱乐下载\组件\过程\过程;美元过程=新过程(ls lsa的);试一试{美元过程- >mustRun ();回声美元过程- >getOutput ();}抓(ProcessFailedException美元e){回声美元e- >getMessage ();}
获得实时的过程输出
当执行一个长时间运行的命令(如rsync-ing文件到远程服务器),你可以给实时反馈给最终用户通过一个匿名函数run ()方法:
1 2 3 4 5 6 7 8 9 10
使用ob娱乐下载\组件\过程\过程;美元过程=新过程(ls lsa的);美元过程- >运行(函数(美元类型,美元缓冲){如果(过程::呃= = =美元类型){回声“呃>”。美元缓冲;}其他的{回声“>”。美元缓冲;}});
异步运行的流程
你也可以异步启动子流程,然后让它运行,检索输出和状态在你的主要过程中当你需要它。使用start ()开始一个异步的过程,方法正在()方法检查过程和完成getOutput ()方法得到的输出:
1 2 3 4 5 6 7 8
美元过程=新过程(ls lsa的);美元过程- >开始();而(美元过程- >正在()){/ /等待过程完成}回声美元过程- >getOutput ();
你也可以等待一个异步过程结束,如果你开始和完成做其他东西:
1 2 3 4 5 6 7 8 9 10 11 12
美元过程=新过程(ls lsa的);美元过程- >开始();/ /……做其他的事情美元过程- >等待(函数(美元类型,美元缓冲){如果(过程::呃= = =美元类型){回声“呃>”。美元缓冲;}其他的{回声“>”。美元缓冲;}});
请注意
的wait ()方法阻断,这意味着您的代码将在这条线,直到停止外部过程完成。
停止一个进程
2.3
的信号
参数的停止
方法是在Symfony 2.3中引入的。ob娱乐下载
任何异步过程可以停在任何时间stop ()方法。该方法接受两个参数:一个超时和一个信号。一旦超时,信号发送到正在运行的进程。默认的信号发送到一个过程SIGKILL
。请阅读信号下面文档欧宝官网下载app找到更多关于信号处理的流程组件:
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 ();
2.3
的ProcessBuilder: setPrefix方法是在Symfony 2.3中引入的。ob娱乐下载
如果你正在构建一个二进制驱动程序,您可以使用setPrefix ()方法前缀的所有命令生成的过程。
下面的例子将生成两个过程焦油二进制适配器的命令:
1 2 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 /焦油的‘-xzf’‘archive.tar.gz’回声美元构建器- >setArguments (数组(“-xzf”,“archive.tar.gz”))- >getProcess ()- >getCommandLine ();
过程超时
您可以限制过程需要完成的时间通过设置一个超时(秒):
1 2 3 4 5
使用ob娱乐下载\组件\过程\过程;美元过程=新过程(ls lsa的);美元过程- >setTimeout (3600年);美元过程- >run ();
如果超时,RuntimeException抛出。
对于长时间运行的命令,这是你的责任来执行超时定期检查:
1 2 3 4 5 6 7 8 9 10 11
美元过程- >setTimeout (3600年);美元过程- >开始();而(美元条件){/ /……/ /检查是否超时美元过程- >checkTimeout ();usleep (200000年);}
过程闲置超时
2.4
的setIdleTimeout ()方法是在Symfony 2.4中引入的。ob娱乐下载
前款规定的超时相比,闲置超时只考虑时间自上次输出是由过程:
1 2 3 4 5 6
使用ob娱乐下载\组件\过程\过程;美元过程=新过程(“something-with-variable-runtime”);美元过程- >setTimeout (3600年);美元过程- >setIdleTimeout (60);美元过程- >run ();
在上面的案例中,一个过程被认为是超时,当总运行时间超过3600秒,或过程不会产生任何输出60秒。
过程的信号
2.3
的信号
方法是在Symfony 2.3中引入的。ob娱乐下载
当异步运行一个程序时,你可以把它与POSIX信号信号()方法:
1 2 3 4 5 6 7
使用ob娱乐下载\组件\过程\过程;美元过程=新过程(“查找/ - name“兔子”);美元过程- >开始();/ /将发送SIGKILL过程美元过程- >信号(SIGKILL);
谨慎
由于一些限制在PHP中,如果你使用信号流程组件,你的命令,你可能需要前缀执行。请阅读ob娱乐下载Symfony的问题# 5759和PHP错误# 39992要理解为什么这是发生。
POSIX信号不可用在Windows平台上,请参考PHP文欧宝官网下载app档可用的信号。
过程Pid
2.3
的getPid
方法是在Symfony 2.3中引入的。ob娱乐下载
1 2 3 4 5 6
使用ob娱乐下载\组件\过程\过程;美元过程=新过程(“/ usr / bin / php worker.php”);美元过程- >开始();美元pid=美元过程- >getPid ();
谨慎
由于一些限制在PHP中,如果你想获得一个symfony的pid的过程,你可能需要前缀你的命令ob娱乐下载执行。请阅读ob娱乐下载Symfony的问题# 5759要理解为什么这是发生。
禁用输出
2.5
的disableOutput ()和enableOutput ()方法在Symfony 2.5中引入的。ob娱乐下载
标准输出和错误输出总是从底层获取过程,它可能是方便禁用输出在某些情况下节省内存。使用disableOutput ()和enableOutput ()这个功能切换:
1 2 3 4 5
使用ob娱乐下载\组件\过程\过程;美元过程=新过程(“/ usr / bin / php worker.php”);美元过程- >disableOutput ();美元过程- >run ();
谨慎
你不能启用或禁用在流程运行时的输出。
如果您禁用输出,你不能访问getOutput
,getIncrementalOutput
,getErrorOutput
或getIncrementalErrorOutput
。此外,你不可能通过一个回调开始
,运行
或mustRun
方法或使用setIdleTimeout
。