proc_get_status() - 获取由proc_open()函数打开的进程的信息 - php 执行命令函数
proc_get_status()
(PHP 5, PHP 7)
获取由proc_open()函数打开的进程的信息
说明
proc_get_status(resource $process): arrayproc_get_status()函数可以获取由proc_open()函数打开的进程的信息。
参数
$process要检查的由proc_open()打开的进程resource。
返回值
如果调用成功,则返回一个包含了进程信息的array,如果发生错误,返回FALSE
。返回的数组包含下列元素:
元素 | 类型 | 描述 |
---|---|---|
command | string | 传入proc_open()函数的命令行字符串。 |
pid | int | 进程 ID |
running | bool | TRUE 表示进程还在运行中,FALSE 表示进程已经终止 |
signaled | bool | TRUE 表示子进程被未捕获的信号所终止。在 Windows 平台永远为FALSE 。 |
stopped | bool | TRUE 表示子进程被信号停止。在 Windows 平台永远为FALSE 。 |
exitcode | int | 进程的退出码(仅在running为FALSE 时有意义)。仅在第一次调用此函数时会返回实际的值,后续的调用将返回-1。 |
termsig | int | 导致子进程终止执行的信号值(仅在signaled为TRUE 时有意义)。 |
stopsig | int | 导致子进程停止执行的信号值(仅在stopped为TRUE 时有意义)。 |
参见
proc_open()
执行一个命令,并且打开用来输入/输出的文件指针。
On Unix/Linux, if you change the command line you pass to proc_open() just slightly then proc_get_status() will give you the actual process-id (pid) of your child. Suppose you wish to run the external command /usr/bin/compress to create a BSD foo.Z file. Rather than proc_open("/usr/bin/compress /tmp/foo",...) you may invoke proc_open("exec /usr/bin/compress /tmp/foo",...) and then proc_get_status()['pid'] will be the actual pid of /usr/bin/compress. Why? Because the way proc_open() actually works on Unix/Linux is by starting "/bin/sh -c usercmd userargs...", e.g., "/bin/sh -c /usr/bin/compress /tmp/foo".[Note 1] That means normally your command is the child of the shell, so the pid you retrieve with proc_get_status() is the pid of the shell (PHP's child), and you have to fumble around trying to find the pid of your command (PHP's grandchild). But if you put "exec" in front of your command, you tell the shell to *replace itself* with your command without starting another process (technically, to exec your command without forking first). That means your command will inherit the pid of the shell, which is the pid that proc_get_status() returns. So if you would like the actual pid of the process running your command, just prepend "exec " to your proc_open() command argument then retrieve the pid using proc_get_status(). This also makes proc_terminate() and proc_close() work more like you might prefer, since they will affect the actual process running your command (which will be a child process rather than a grandchild process). [Note 1] My guess is that the PHP developers want the shell to expand wildcards in path/filenames.
It is worth noting that proc_get_status will continue to indicate the process that you spawned is running (because it is!) until that process has been able to write everything it wants to write to the STDOUT and STDERR streams. PHP seems to use a buffer for this and so the spawned process can can get it's write calls to return immediately. However, once this buffer is full the write call will block until you read out some of the information from the stream/pipe. This can manifest itself in many ways but generally the called process will still be running, but just not doing anything as it is blocking on being able to write more to STDERR or STDOUT -- whichever stream buffer is full. To work around this you should include in your loop of checking proc_get_status' running element a "stream_get_contents" on the relevant pipes. I generally use stream_set_blocking($pipies[2], 0) kind of calls to make sure that the stream_get_contents call will not block if there is no data in the stream. This one had me stumped for a while, so hopefully it helps someone!
For clarification, the "exitcode" is only valid the FIRST TIME IT IS CALLED after the process exits. If you have a method that polls a spawned process for its status, you *MUST* have that same method capture the exitcode: if the method is called a second time (after realizing the pid is dead) and it hasn't cached that exitcode, it will receive the -1 mentioned.
The following function takes an array of shell commands and executes them. It is able to execute up to $nb_max_process at the same time. As soon as one process is terminated, another one is executed. Quite useful if you want to batch process commands on a multi-processor or multi-core environment. The example below tries to convert to PNG a list of SVG files submitted on the command line (using Inkscape). (it's quick and dirty but works very well for me) #!/usr/bin/php
鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com
免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)
图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!
内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)