《交响乐5:快车道》的封面欧宝娱乐app下载地址”src=

欧宝娱乐app下载地址交响乐5:快车道是学习现代Symfony发展,从零到生产的最好书籍。欧宝娱乐app下载地址+300页展示Symfony与Docker,欧宝娱乐app下载地址 api,队列和异步任务,Webpack, spa等。

流程组件

使用欧宝娱乐app下载地址Symfony \组件\ \过程类在子进程中执行命令,注意操作系统和转义参数之间的差异,以防止安全问题。它取代了PHP函数,如执行,passthru,shell_exec系统:

使用欧宝娱乐app下载地址Symfony \组件\ \例外\ ProcessFailedException过程;使用欧宝娱乐app下载地址Symfony \组件\ \过程;美元的过程=过程([“ls”,“文理学院”]);美元的过程->运行();//在命令完成后执行如果(!美元的过程->公布()){processfailedException.(美元的过程);}回声美元的过程->get输出();

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

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

也可以使用欧宝娱乐app下载地址Symfony \组件\ \过程对于每个构造的类,可以在生成时获取输出。默认情况下,循环在进入下一次迭代之前等待新的输出:

美元的过程=过程([“ls”,“文理学院”]);美元的过程->开始();foreach(美元的过程作为$ type.=>元数据){如果(美元的过程::出去= = =$ type.){回声\ n从stdout读取:"元数据;}其他的{// $ process :: frer === $ type回声\ n从stderr读取:"元数据;}}

提示

Process组件内部使用PHP迭代器在生成输出时获取输出。对象公开该迭代器getIterator ()方法允许自定义其行为:

美元的过程=过程([“ls”,“文理学院”]);美元的过程->开始();美元的迭代器=美元的过程->getIterator(美元的过程::ITER_SKIP_ERR|美元的过程::ITER_KEEP_OUTPUT);foreach(美元的迭代器作为元数据){回声元数据\ n;}

mustRun ()方法等同于跑步(),除了它会扔一个欧宝娱乐app下载地址Symfony \组件\ \例外\ ProcessFailedException过程如果进程不能成功执行(即进程以非零代码退出):

使用欧宝娱乐app下载地址Symfony \组件\ \例外\ ProcessFailedException过程;使用欧宝娱乐app下载地址Symfony \组件\ \过程;美元的过程=过程([“ls”,“文理学院”]);试一试{美元的过程->mustRun();回声美元的过程->get输出();}抓住(processfailedException.美元的例外){回声美元的例外->getMessage();}

提示

属性可以获取以秒为单位的最后输出时间getLastOutputTime ()方法。此方法返回如果进程没有启动!

欧宝娱乐app下载地址symfony使用phpproc_open函数运行进程。属性传递的选项可以配置other_options争论proc_open ()使用setoption ()方法:

美元的过程=过程([“……”,“……”,“……”]);//此选项允许子进程在退出主脚本后继续运行美元的过程->setoption([“create_new_console”=>真正的]);

如果需要使用流重定向、条件执行或操作系统外壳提供的任何其他特性,还可以使用fromShellCommandline ()静态工厂。

每个操作系统为其命令行提供不同的语法,因此处理逃逸和可移植性的责任成为您的责任。

当使用字符串来定义命令时,使用第二个参数将变量参数传递为环境变量跑步(),mustRun ()start ()方法。引用它们也是依赖于操作系统的:

//在类unix操作系统(Linux, macOS)上美元的过程=过程::来自谢尔姆曼德林(“回声“元信息””);//在Windows上美元的过程=过程::来自谢尔姆曼德林(“回声”消息!“‘);//在类unix和Windows上美元的过程->运行(,(“消息”=>“输出的东西”]);

如果你喜欢创建独立于操作系统的可移植命令,你可以这样写上面的命令:

//在Windows, Linux和macOS上工作相同美元的过程=过程::来自谢尔姆曼德林(”echo ${:消息}”);

便携式命令使用特定于组件的语法:将变量名称括到“$ {:}“确切地说,进程对象将用它转义的值替换它,或者如果在附加到该命令的环境变量列表中找不到该变量,则会失败。

设置进程的环境变量欧宝娱乐app下载地址Symfony \组件\ \过程类和与执行流程相关的所有方法(跑步(),mustRun (),start ()等等)允许在运行进程的同时传递一个环境变量来设置:

美元的过程=过程([“……”],,(“ENV_VAR_NAME”=>“价值”]);美元的过程=过程::来自谢尔姆曼德林(“……”,,(“ENV_VAR_NAME”=>“价值”]);美元的过程->运行(,(“ENV_VAR_NAME”=>“价值”]);

除了显式传递的env变量外,进程还继承系统中定义的所有env变量。您可以通过设置为来防止这种情况你想要删除的env变量:

美元的过程=过程([“……”],,(“APP_ENV”=>,'欧宝娱乐app下载地址symfony_dotenv_vars'=>,]);

获得实时过程输出rsync到远程服务器),您可以通过将匿名功能传递给最终用户的反馈跑步()方法:

使用欧宝娱乐app下载地址Symfony \组件\ \过程;美元的过程=过程([“ls”,“文理学院”]);美元的过程->运行(函数($ type.,$缓冲){如果(过程::犯错= = =$ type.){回声“呃>”$缓冲;}其他的{回声'出来>'$缓冲;}});

请注意

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

异步运行的流程start ()方法来启动异步进程,则正在()方法来检查流程是否完成,以及getoutput()方法获取输出:

美元的过程=过程([“ls”,“文理学院”]);美元的过程->开始();(美元的过程->正在()){//等待进程完成}回声美元的过程->get输出();

如果您异步启动它,您还可以等待一个进程结束,并且完成其他东西:

美元的过程=过程([“ls”,“文理学院”]);美元的过程->开始();/ /……做其他的事情美元的过程->等待();/ /……在流程完成之后做什么

请注意

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

请注意

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

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

警告

请注意,如果您这样做,则在子处理完成之前,将不可用的PHP-FPM进程提供任何新请求。这意味着如果您不够小心,您可以快速阻止您的FPM池。这就是为什么即使在发送请求之后,它通常不会做任何幻想的东西,而是使用作业队列。

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

美元的过程=过程([“ls”,“文理学院”]);美元的过程->开始();美元的过程->等待(函数($ type.,$缓冲){如果(过程::犯错= = =$ type.){回声“呃>”$缓冲;}其他的{回声'出来>'$缓冲;}});

而不是等待流程完成,您可以使用等到()方法来保持或停止等待,基于一些PHP逻辑。下面的例子启动了一个长时间运行的进程,并检查它的输出,直到它完全初始化:

美元的过程=过程([“/ usr / bin / php”,'慢动作 -  server.php']);美元的过程->开始();/ /……做其他的事情//等待匿名函数返回true美元的过程->等到(函数($ type.,输出美元){返回输出美元= = =“准备好了。等待命令……”;});/ /……在流程准备好之后进行操作

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

美元的过程=过程([“猫”]);美元的过程->setInpul.(“foobar”);美元的过程->运行();

当该输入完全写入子过程标准输入时,相应的管道关闭。

为了在运行时写入子处理标准输入,组件提供了欧宝娱乐app下载地址symfony \ component \ process \ InputStream班级:

输入美元=InputStream.();输入美元->(“foo”);美元的过程=过程([“猫”]);美元的过程->setInpul.(输入美元);美元的过程->开始();/ /……读取进程输出或做其他事情输入美元->(“酒吧”);输入美元->关闭();美元的过程->等待();//将回显:foobar回声美元的过程->get输出();

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

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

$流=打开外部文件(php: / /临时的,“w +”);美元的过程=过程([“猫”]);美元的过程->setInpul.($流);美元的过程->开始();写入文件($流,“foo”);/ /……读取进程输出或做其他事情写入文件($流,“酒吧”);fclose.($流);美元的过程->等待();//将回声:'foobar'回声美元的过程->get输出();

使用TTY和PTY模式setInput ())和该过程的输出(使用getoutput())。Process组件有两种特殊的模式来调整程序和进程之间的关系:电传打字(tty)和伪电传打字(pty)。

在TTY模式下,将过程的输入和输出连接到程序的输入和输出。这允许例如将vim或nano等编辑器作为过程打开。通过调用来启用TTY模式setty():

美元的过程=过程([“活力”]);美元的过程->setTty(真正的);美元的过程->运行();//由于输出连接到终端,这是不可能的//读取或修改进程的输出!转储(美元的过程->get输出());// 空值

在PTY模式下,你的程序作为进程的终端,而不是简单的输入和输出。有些程序在与真实终端交互时的行为与另一个程序不同。例如,有些程序在与终端通话时提示输入密码。使用setPty ()启用此模式。

停止一个进程stop ()方法。此方法需要两个参数:超时和信号。一旦达到超时,信号就会发送到正在运行的过程。发送到进程的默认信号是SIGKILL。请阅读信号下面文档欧宝体育电话要了解更多关于Process组件中的信号处理的信息:

美元的过程=过程([“ls”,“文理学院”]);美元的过程->开始();/ /……做其他的事情美元的过程->停止(3.,信号情报);

隔离执行PHP代码PhpProcess而不是:

使用欧宝娱乐app下载地址symfony \ component \ process \ phpprocess;美元的过程=PhpProcess(<<<EOF< ?='Hello World' ?>EOF);美元的过程->运行();

使用准备好的命令行
使用欧宝娱乐app下载地址Symfony \组件\ \过程;美元的过程=过程::来自谢尔姆曼德林(“回声”美元的名字”);美元的过程->运行(,(“名字”=>'elsa']);

警告

准备好的命令行不会自动转义!

过程超时setTimeout ()方法:

使用欧宝娱乐app下载地址Symfony \组件\ \过程;美元的过程=过程([“ls”,“文理学院”]);美元的过程->setTimeout(3600);美元的过程->运行();

如果达到超时时间,则a欧宝娱乐app下载地址Symfony \组件\ \例外\ ProcessTimedOutException过程抛出。

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

美元的过程->setTimeout(3600);美元的过程->开始();($条件){/ /……//检查是否超时美元的过程->checkTimeout();usleep(200000年);}

提示

您可以使用该过程开始时间使用getStartTime ()方法。

5.1版中的新增功能:getStartTime ()Symfony 5.1中介绍了该方法。欧宝娱乐app下载地址

过程闲置超时
使用欧宝娱乐app下载地址Symfony \组件\ \过程;美元的过程=过程([“something-with-variable-runtime”]);美元的过程->setTimeout(3600);美元的过程->setIdleTimeout(60.);美元的过程->运行();

在上面的例子中,当总运行时间超过3600秒,或者在60秒内进程没有产生任何输出时,就认为进程超时了。

过程的信号信号()方法:

使用欧宝娱乐app下载地址Symfony \组件\ \过程;美元的过程=过程([“发现”,' / ',“- name”,“兔子”]);美元的过程->开始();//将向进程发送一个sigkill美元的过程->信号(SIGKILL);

过程PID.pid的运行进程的getPid()方法:

使用欧宝娱乐app下载地址Symfony \组件\ \过程;美元的过程=过程([“/ usr / bin / php”,“worker.php”]);美元的过程->开始();$ PID=美元的过程->getPid();

禁用输出disableOutput ()enableOutput ()要切换此功能:

使用欧宝娱乐app下载地址Symfony \组件\ \过程;美元的过程=过程([“/ usr / bin / php”,“worker.php”]);美元的过程->disableOutput();美元的过程->运行();

警告

在进程运行时,无法启用或禁用输出。

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

但是,可以将回调传递给开始,运行mustRun方法以流方式处理流程输出。

找到一个可执行文件欧宝娱乐app下载地址Symfony \组件\ \ ExecutableFinder过程哪个发现并返回可执行文件的绝对路径:

使用欧宝娱乐app下载地址Symfony \组件\ \ ExecutableFinder过程;executableFinder美元=ExecutableFinder();$ chromedriverpath.=executableFinder美元->找到('Chromedriver');// $chromedriverPath = '/usr/local/bin/chromedriver'(结果将不同于你的电脑)

find ()方法也接受额外的参数来指定要返回的默认值和寻找可执行文件的额外目录:

使用欧宝娱乐app下载地址Symfony \组件\ \ ExecutableFinder过程;executableFinder美元=ExecutableFinder();$ chromedriverpath.=executableFinder美元->找到('Chromedriver',“/道路/ / chromedriver”,('local-bin /']);

寻找可执行PHP二进制文件欧宝娱乐app下载地址Symfony \组件\ \ PhpExecutableFinder过程返回服务器上可用的可执行PHP二进制文件的绝对路径:

使用欧宝娱乐app下载地址Symfony \组件\ \ PhpExecutableFinder过程;phpBinaryFinder美元=phpexecutablefinder.();phpBinaryPath美元=phpBinaryFinder美元->找到();// $phpBinaryPath = '/usr/local/bin/php'(结果将不同于你的电脑)

检查TTY支持isTtySupported ()它返回是否TTY当前操作系统支持:

使用欧宝娱乐app下载地址Symfony \组件\ \过程;美元的过程=(过程())->setTty(过程::isttysupported.());

这项工作,包括代码样本,是在一个创作共用BY-SA 3.0许可证。