过程组件

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 3.4,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

过程组件

Process组件在子进程中执行命令。

安装

1
作曲家需要symfony/过程:^ob娱乐下载3.4

请注意

如果在Symfony应用程序外部安装此组件,则必须要求ob娱乐下载供应商/ autoload.php文件,以启用Composer提供的类自动加载机制。读这篇文章欲知详情。

使用

过程类允许你在子进程中执行命令:

12 3 4 5 6 7 8 9 10 11 12
使用ob娱乐下载组件过程异常ProcessFailedException使用ob娱乐下载组件过程过程过程过程([“ls”“文理学院”]);过程->run ();//在命令完成后执行如果(!过程->isSuccessful ()) {ProcessFailedException (过程);}回声过程->getOutput ();

在执行命令时,该组件负责处理不同平台之间的细微差异。

getOutput ()方法总是返回命令和标准输出的全部内容getErrorOutput ()错误输出的内容。或者,getIncrementalOutput ()getIncrementalErrorOutput ()方法返回自上次调用以来的新输出。

clearOutput ()方法清除输出和的内容clearErrorOutput ()清除错误输出的内容。

你也可以使用过程类,以便在生成输出时获取输出。默认情况下,循环在进行下一次迭代之前等待新的输出:

1 2 3 4 5 6 7 8 9 10
过程过程([“ls”“文理学院”]);过程->开始();foreach过程作为类型= >数据){如果过程::出= = =类型){回声\nRead from stdout: "数据;}其他的// $process::ERR === $type回声\nRead from stderr: "数据;}}

提示

Process组件在内部使用一个PHP迭代器来获取生成的输出。迭代器通过getIterator ()方法来允许自定义其行为:

1 2 3 4 5 6
过程过程([“ls”“文理学院”]);过程->开始();迭代器过程->getIterator (过程::ITER_SKIP_ERR |过程::ITER_KEEP_OUTPUT);foreach迭代器作为数据){回声数据“\ n”;}

3.2

getIterator ()方法是在Symfony 3.2中引入的。ob娱乐下载

mustRun ()方法与run (),除了它会抛出一个ProcessFailedException如果进程不能成功执行(即进程以非零代码退出):

12 3 4 5 6 7 8 9 10 11 12
使用ob娱乐下载组件过程异常ProcessFailedException使用ob娱乐下载组件过程过程过程过程([“ls”“文理学院”]);试一试过程->mustRun ();回声过程->getOutput ();}(ProcessFailedException异常){回声异常->getMessage ();}

提示

3.3

在Symfony 3.3中引入了将命令定义为参数数组的功能。ob娱乐下载

使用参数数组是定义命令的推荐方式。这可以避免任何转义,并允许无缝发送信号(例如,在完成之前停止进程):

1 2
过程过程([“/道路/命令””,选择““参数”“等等。”]);过程过程([/道路/ / php的“——定义”“memory_limit = 1024”“/道路/ / script.php”]);

如果您需要使用流重定向、条件执行或操作系统shell提供的任何其他特性,您还可以将命令定义为字符串。

请注意,每个操作系统为它们的命令行提供了不同的语法,因此您有责任处理转义和可移植性。

类的第二个参数将变量参数作为环境变量传递给命令行字符串run ()mustRun ()start ()方法。引用它们也依赖于操作系统:

1 2 3 4 5 6 7 8
//在类unix操作系统(Linux, macOS)上过程过程(“回声“元信息””);//在Windows上过程过程(“回声”消息!“‘);//在类unix和Windows上过程->运行(, (“消息”= >“要输出的东西”]);

获得实时流程输出

当执行一个长时间运行的命令(如rsync对象的匿名函数可以实时地向最终用户提供反馈run ()方法:

1 2 3 4 5 6 7 8 9 10
使用ob娱乐下载组件过程过程过程过程([“ls”“文理学院”]);过程->运行(函数类型缓冲如果(过程::呃= = =类型){回声' err > '缓冲;}其他的回声' out > '缓冲;}});

请注意

在使用PHP输出缓冲的服务器中,该特性无法正常工作。在这些情况下,禁用output_bufferingPHP选项或使用ob_flushPHP函数强制发送输出缓冲区。

异步运行进程

您还可以启动子进程,然后让它异步运行,在需要时检索主进程中的输出和状态。使用start ()方法来启动异步进程正在()方法检查进程是否已完成getOutput ()方法获取输出:

1 2 3 4 5 6 7 8
过程过程([“ls”“文理学院”]);过程->开始();过程->正在()){//等待进程结束回声过程->getOutput ();

你也可以等待一个进程结束,如果你异步启动它,并完成了其他事情:

1 2 3 4 5 6 7 8
过程过程([“ls”“文理学院”]);过程->开始();/ /……做其他事情过程->wait ();/ /……在流程完成后再做事情

请注意

wait ()方法正在阻塞,这意味着您的代码将在这一行停止,直到外部进程完成。

请注意

如果一个响应发送之前如果子进程有机会完成,服务器进程将被杀死(取决于你的操作系统)。这意味着您的任务将立即停止。运行异步进程与运行其父进程存活下来的进程是不同的。

如果希望流程在请求/响应周期中存活,可以利用kernel.terminate事件,并运行您的命令同步在此事件内部。请注意kernel.terminate只在使用PHP-FPM时调用。

谨慎

还要注意的是,如果这样做,在子进程完成之前,上述PHP-FPM进程将无法为任何新请求提供服务。这意味着如果你不够小心,你可能很快就会阻塞你的FPM池。这就是为什么即使在发送请求之后也不要做任何花哨的事情,而是使用作业队列的原因。

wait ()接受一个可选参数:在进程仍在运行时重复调用的回调,传递输出及其类型:

1 2 3 4 5 6 7 8 9 10
过程过程([“ls”“文理学院”]);过程->开始();过程->等待(函数类型缓冲如果(过程::呃= = =类型){回声' err > '缓冲;}其他的回声' out > '缓冲;}});

流到流程的标准输入

方法指定其标准输入,然后启动流程setInput ()方法或构造函数的第4个参数。提供的输入可以是字符串、流资源或可否认的对象:

1 2 3
过程过程(“猫”);过程->setInput (“foobar”);过程->run ();

当这个输入完全写入子进程标准输入时,相应的管道将被关闭。

为了在子流程运行时写入子流程标准输入,组件提供了InputStream类:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
输入InputStream ();输入->写(“foo”);过程过程([“猫”]);过程->setInput (输入);过程->开始();/ /……读取流程输出或做其他事情输入->写(“酒吧”);输入->close ();过程->wait ();//将回显:foobar回声过程->getOutput ();

write ()方法接受标量、流资源或可否认的对象作为参数。如上面的示例所示,需要显式调用close ()当您完成对子流程的标准输入的写入时,可以使用。

使用PHP流作为进程的标准输入

流程的输入也可以使用PHP流

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
= fopen (php: / /临时的“w +”);过程过程([“猫”]);过程->setInput ();过程->开始();写入文件(“foo”);/ /……读取流程输出或做其他事情写入文件(“酒吧”);fclose ();过程->wait ();//将回显:'foobar'回声过程->getOutput ();

停止进程

方法可以在任何时候停止任何异步进程stop ()方法。这个方法有两个参数:一个超时和一个信号。一旦超时,信号就被发送到正在运行的进程。发送给进程的默认信号是SIGKILL.请细阅信号文档如下欧宝官网下载app以了解更多关于Process组件中信号处理的信息:

1 2 3 4 5 6
过程过程([“ls”“文理学院”]);过程->开始();/ /……做其他事情过程->停止(3.、信号情报);

单独执行PHP代码

如果要单独执行某些PHP代码,请使用PhpProcess而不是:

1 2 3 4 5 6 7
使用ob娱乐下载组件过程PhpProcess过程PhpProcess (< < < EOF < ?='Hello World' ?> EOF);过程->run ();

过程超时

默认情况下,进程的超时时间为60秒,但您可以将不同的超时时间(以秒为单位)传递给setTimeout ()方法:

1 2 3 4 5
使用ob娱乐下载组件过程过程过程过程([“ls”“文理学院”]);过程->setTimeout (3600);过程->run ();

如果达到超时,则aProcessTimedOutException抛出。

对于长时间运行的命令,你有责任定期执行超时检查:

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娱乐下载组件过程过程过程过程([“发现”' / '“- name”“兔子”]);过程->开始();//将向进程发送一个SIGKILL过程->信号(SIGKILL);

过程PID

您可以访问PID属性的正在运行进程的getPid ()方法:

1 2 3 4 5 6
使用ob娱乐下载组件过程过程过程过程([“/ usr / bin / php”“worker.php”]);过程->开始();pid过程->getPid ();

禁用输出

由于标准输出和错误输出总是从底层进程中获取,因此在某些情况下禁用输出以节省内存可能很方便。使用disableOutput ()enableOutput ()切换此功能:

1 2 3 4 5
使用ob娱乐下载组件过程过程过程过程([“/ usr / bin / php”“worker.php”]);过程->disableOutput ();过程->run ();

谨慎

在流程运行时,不能启用或禁用输出。

如果禁用输出,则无法访问getOutput ()getIncrementalOutput ()getErrorOutput ()getIncrementalErrorOutput ()setIdleTimeout ()

对象的回调函数是可能的开始运行mustRun方法以流方式处理流程输出。

3.1

在Symfony 3.1中引入了在输出被禁用时向这些方法传递回调的功能。ob娱乐下载

查找可执行PHP二进制文件

该组件还提供了一个名为PhpExecutableFinder返回服务器上可用的可执行PHP二进制文件的绝对路径:

1 2 3 4 5
使用ob娱乐下载组件过程PhpExecutableFinderphpBinaryFinderPhpExecutableFinder ();phpBinaryPathphpBinaryFinder->find ();// $phpBinaryPath = '/usr/local/bin/php'(结果在您的计算机上将是不同的)
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。