mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-18 05:26:57 +08:00
270 lines
14 KiB
HTML
270 lines
14 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||
<html>
|
||
<head>
|
||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||
<title>执行一个命令,并且打开用来输入/输出的文件指针。</title>
|
||
</head>
|
||
<body class="docs"><div id="layout">
|
||
<div id="layout-content"><div id="function.proc-open" class="refentry">
|
||
<div class="refnamediv">
|
||
<h1 class="refname">proc_open</h1>
|
||
<p class="verinfo">(PHP 4 >= 4.3.0, PHP 5, PHP 7)</p><p class="refpurpose"><span class="refname">proc_open</span> — <span class="dc-title">
|
||
执行一个命令,并且打开用来输入/输出的文件指针。
|
||
</span></p>
|
||
|
||
</div>
|
||
<div class="refsect1 description" id="refsect1-function.proc-open-description">
|
||
<h3 class="title">说明</h3>
|
||
<div class="methodsynopsis dc-description">
|
||
<span class="methodname"><strong>proc_open</strong></span>
|
||
( <span class="methodparam"><span class="type">string</span> <code class="parameter">$cmd</code></span>
|
||
, <span class="methodparam"><span class="type">array</span> <code class="parameter">$descriptorspec</code></span>
|
||
, <span class="methodparam"><span class="type">array</span> <code class="parameter reference">&$pipes</code></span>
|
||
[, <span class="methodparam"><span class="type">string</span> <code class="parameter">$cwd</code></span>
|
||
[, <span class="methodparam"><span class="type">array</span> <code class="parameter">$env</code></span>
|
||
[, <span class="methodparam"><span class="type">array</span> <code class="parameter">$other_options</code></span>
|
||
]]] ) : <span class="type">resource</span></div>
|
||
|
||
<p class="para rdfs-comment">
|
||
类似 <span class="function"><a href="popen.html" class="function">popen()</a></span> 函数,
|
||
但是 <span class="function"><strong>proc_open()</strong></span> 提供了更加强大的控制程序执行的能力。
|
||
</p>
|
||
|
||
|
||
|
||
</div>
|
||
|
||
|
||
<div class="refsect1 parameters" id="refsect1-function.proc-open-parameters">
|
||
<h3 class="title">参数</h3>
|
||
<p class="para">
|
||
<dl>
|
||
|
||
|
||
<dt>
|
||
<code class="parameter">cmd</code></dt>
|
||
|
||
<dd>
|
||
|
||
<p class="para">
|
||
要执行的命令
|
||
</p>
|
||
</dd>
|
||
|
||
|
||
|
||
<dt>
|
||
<code class="parameter">descriptorspec</code></dt>
|
||
|
||
<dd>
|
||
|
||
<p class="para">
|
||
一个索引数组。
|
||
数组的键表示描述符,数组元素值表示 PHP 如何将这些描述符传送至子进程。
|
||
0 表示标准输入(stdin),1 表示标准输出(stdout),2 表示标准错误(stderr)。
|
||
</p>
|
||
<p class="para">
|
||
数组中的元素可以是:
|
||
<ul class="simplelist">
|
||
<li class="member">
|
||
包含了要传送至进程的管道的描述信息。
|
||
第一个元素为描述符类型,
|
||
第二个元素是针对该描述符的选项。
|
||
有效的类型有:<em>pipe</em>
|
||
(第二个元素可以是: <em>r</em> 向进程传送该管道的读取端,<em>w</em> 向进程传送该管道的写入端),
|
||
以及 <em>file</em>(第二个元素为文件名)。
|
||
</li>
|
||
<li class="member">
|
||
表达一个真实文件描述符的流资源类型
|
||
(例如:已打开的文件,一个 socket 端口,<strong><code>STDIN</code></strong>)。
|
||
</li>
|
||
</ul>
|
||
</p>
|
||
<p class="para">
|
||
文件描述符的值不限于 0,1 和 2,你可以使用任何有效的文件描述符
|
||
并将其传送至子进程。
|
||
这使得你的脚本可以和其他脚本交互操作。
|
||
例如,可以通过指定文件描述符将密码以更加安全的方式
|
||
传送至诸如 PGP,GPG 和 openssl 程序,
|
||
同时也可以很方便的获取这些程序的状态信息。
|
||
</p>
|
||
</dd>
|
||
|
||
|
||
|
||
<dt>
|
||
<code class="parameter">pipes</code></dt>
|
||
|
||
<dd>
|
||
|
||
<p class="para">
|
||
将被置为索引数组,
|
||
其中的元素是被执行程序创建的管道对应到 PHP 这一端的文件指针。
|
||
</p>
|
||
</dd>
|
||
|
||
|
||
|
||
<dt>
|
||
<code class="parameter">cwd</code></dt>
|
||
|
||
<dd>
|
||
|
||
<p class="para">
|
||
要执行命令的初始工作目录。
|
||
必须是 <em class="emphasis">绝对</em> 路径,
|
||
设置此参数为 <strong><code>NULL</code></strong>
|
||
表示使用默认值(当前 PHP 进程的工作目录)。
|
||
</p>
|
||
</dd>
|
||
|
||
|
||
|
||
<dt>
|
||
<code class="parameter">env</code></dt>
|
||
|
||
<dd>
|
||
|
||
<p class="para">
|
||
要执行的命令所使用的环境变量。
|
||
设置此参数为 <strong><code>NULL</code></strong> 表示使用和当前 PHP 进程相同的环境变量。
|
||
</p>
|
||
</dd>
|
||
|
||
|
||
|
||
<dt>
|
||
<code class="parameter">other_options</code></dt>
|
||
|
||
<dd>
|
||
|
||
<p class="para">
|
||
你还可以指定一些附加选项。
|
||
目前支持的选项包括:
|
||
<ul class="simplelist">
|
||
<li class="member">
|
||
<em>suppress_errors</em> (仅用于 Windows 平台):
|
||
设置为 <strong><code>TRUE</code></strong> 表示抑制本函数产生的错误。
|
||
</li>
|
||
<li class="member">
|
||
<em>bypass_shell</em> (仅用于 Windows 平台):
|
||
设置为 <strong><code>TRUE</code></strong> 表示绕过 <em>cmd.exe</em> shell。
|
||
</li>
|
||
</ul>
|
||
</p>
|
||
</dd>
|
||
|
||
|
||
</dl>
|
||
|
||
</p>
|
||
</div>
|
||
|
||
|
||
<div class="refsect1 returnvalues" id="refsect1-function.proc-open-returnvalues">
|
||
<h3 class="title">返回值</h3>
|
||
<p class="para">
|
||
返回表示进程的资源类型,
|
||
当使用完毕之后,请调用 <span class="function"><a href="proc_close.html" class="function">proc_close()</a></span> 函数来关闭此资源。
|
||
如果失败,返回 <strong><code>FALSE</code></strong>。
|
||
</p>
|
||
</div>
|
||
|
||
|
||
<div class="refsect1 changelog" id="refsect1-function.proc-open-changelog">
|
||
<h3 class="title">更新日志</h3>
|
||
<p class="para">
|
||
<table class="doctable informaltable">
|
||
|
||
<thead>
|
||
<tr>
|
||
<th>版本</th>
|
||
<th>说明</th>
|
||
</tr>
|
||
|
||
</thead>
|
||
|
||
<tbody class="tbody">
|
||
<tr>
|
||
<td>5.2.1</td>
|
||
<td>
|
||
为 <code class="parameter">other_options</code> 参数增加 <em>bypass_shell</em> 选项。
|
||
</td>
|
||
</tr>
|
||
|
||
</tbody>
|
||
|
||
</table>
|
||
|
||
</p>
|
||
</div>
|
||
|
||
|
||
<div class="refsect1 examples" id="refsect1-function.proc-open-examples">
|
||
<h3 class="title">范例</h3>
|
||
<p class="para">
|
||
<div class="example" id="example-4361">
|
||
<p><strong>Example #1 <span class="function"><strong>proc_open()</strong></span> 例程</strong></p>
|
||
<div class="example-contents">
|
||
<div class="phpcode"><pre><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br />$descriptorspec </span><span style="color: #007700">= array(<br /> </span><span style="color: #0000BB">0 </span><span style="color: #007700">=> array(</span><span style="color: #DD0000">"pipe"</span><span style="color: #007700">, </span><span style="color: #DD0000">"r"</span><span style="color: #007700">), </span><span style="color: #FF8000">// 标准输入,子进程从此管道中读取数据<br /> </span><span style="color: #0000BB">1 </span><span style="color: #007700">=> array(</span><span style="color: #DD0000">"pipe"</span><span style="color: #007700">, </span><span style="color: #DD0000">"w"</span><span style="color: #007700">), </span><span style="color: #FF8000">// 标准输出,子进程向此管道中写入数据<br /> </span><span style="color: #0000BB">2 </span><span style="color: #007700">=> array(</span><span style="color: #DD0000">"file"</span><span style="color: #007700">, </span><span style="color: #DD0000">"/tmp/error-output.txt"</span><span style="color: #007700">, </span><span style="color: #DD0000">"a"</span><span style="color: #007700">) </span><span style="color: #FF8000">// 标准错误,写入到一个文件<br /></span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$cwd </span><span style="color: #007700">= </span><span style="color: #DD0000">'/tmp'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$env </span><span style="color: #007700">= array(</span><span style="color: #DD0000">'some_option' </span><span style="color: #007700">=> </span><span style="color: #DD0000">'aeiou'</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$process </span><span style="color: #007700">= </span><span style="color: #0000BB">proc_open</span><span style="color: #007700">(</span><span style="color: #DD0000">'php'</span><span style="color: #007700">, </span><span style="color: #0000BB">$descriptorspec</span><span style="color: #007700">, </span><span style="color: #0000BB">$pipes</span><span style="color: #007700">, </span><span style="color: #0000BB">$cwd</span><span style="color: #007700">, </span><span style="color: #0000BB">$env</span><span style="color: #007700">);<br /><br />if (</span><span style="color: #0000BB">is_resource</span><span style="color: #007700">(</span><span style="color: #0000BB">$process</span><span style="color: #007700">)) {<br /> </span><span style="color: #FF8000">// $pipes 现在看起来是这样的:<br /> // 0 => 可以向子进程标准输入写入的句柄<br /> // 1 => 可以从子进程标准输出读取的句柄<br /> // 错误输出将被追加到文件 /tmp/error-output.txt<br /><br /> </span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$pipes</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">], </span><span style="color: #DD0000">'<?php print_r($_ENV); ?>'</span><span style="color: #007700">);<br /> </span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$pipes</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]);<br /><br /> echo </span><span style="color: #0000BB">stream_get_contents</span><span style="color: #007700">(</span><span style="color: #0000BB">$pipes</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">]);<br /> </span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$pipes</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">]);<br /> <br /><br /> </span><span style="color: #FF8000">// 切记:在调用 proc_close 之前关闭所有的管道以避免死锁。<br /> </span><span style="color: #0000BB">$return_value </span><span style="color: #007700">= </span><span style="color: #0000BB">proc_close</span><span style="color: #007700">(</span><span style="color: #0000BB">$process</span><span style="color: #007700">);<br /><br /> echo </span><span style="color: #DD0000">"command returned </span><span style="color: #0000BB">$return_value</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</pre></div>
|
||
</div>
|
||
|
||
<div class="example-contents"><p>以上例程的输出类似于:</p></div>
|
||
<div class="example-contents screen">
|
||
<div class="cdata"><pre>
|
||
Array
|
||
(
|
||
[some_option] => aeiou
|
||
[PWD] => /tmp
|
||
[SHLVL] => 1
|
||
[_] => /usr/local/bin/php
|
||
)
|
||
command returned 0
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</p>
|
||
|
||
|
||
|
||
</div>
|
||
|
||
|
||
<div class="refsect1 notes" id="refsect1-function.proc-open-notes">
|
||
<h3 class="title">注释</h3>
|
||
<blockquote class="note"><p><strong class="note">Note</strong>:
|
||
<p class="para">
|
||
Windows 兼容性:超过 2 的描述符也可以作为可继承的句柄传送到子进程。
|
||
但是,由于 Windows 的架构并不将文件描述符和底层句柄进行关联,
|
||
所以,子进程无法访问这样的句柄。
|
||
标准输入,标准输出和标注错误会按照预期工作。
|
||
</p>
|
||
</p></blockquote>
|
||
<blockquote class="note"><p><strong class="note">Note</strong>:
|
||
<p class="para">
|
||
如果你只需要单向的进程管道,
|
||
使用 <span class="function"><a href="popen.html" class="function">popen()</a></span> 函数会更加简单。
|
||
</p>
|
||
</p></blockquote>
|
||
</div>
|
||
|
||
|
||
<div class="refsect1 seealso" id="refsect1-function.proc-open-seealso">
|
||
<h3 class="title">参见</h3>
|
||
<p class="para">
|
||
<ul class="simplelist">
|
||
<li class="member"><span class="function"><a href="popen.html" class="function" rel="rdfs-seeAlso">popen()</a> - 打开进程文件指针</span></li>
|
||
<li class="member"><span class="function"><a href="exec.html" class="function" rel="rdfs-seeAlso">exec()</a> - 执行一个外部程序</span></li>
|
||
<li class="member"><span class="function"><a href="system.html" class="function" rel="rdfs-seeAlso">system()</a> - 执行外部程序,并且显示输出</span></li>
|
||
<li class="member"><span class="function"><a href="passthru.html" class="function" rel="rdfs-seeAlso">passthru()</a> - 执行外部程序并且显示原始输出</span></li>
|
||
<li class="member"><span class="function"><a href="stream_select.html" class="function" rel="rdfs-seeAlso">stream_select()</a> - Runs the equivalent of the select() system call on the given
|
||
arrays of streams with a timeout specified by tv_sec and tv_usec</span></li>
|
||
<li class="member">The <a href="language.operators.execution.html" class="link">执行操作符</a></li>
|
||
</ul>
|
||
</p>
|
||
</div>
|
||
|
||
</div></div></div></body></html> |