優雅的玩PHP多程式
proc_open
(PHP 4 >= 4.3.0, PHP 5, PHP 7)
proc_open — 執行一個命令,並且開啟用來輸入/輸出的檔案指標。
說明 ¶
$cmd
, array $descriptorspec
, array &$pipes
[, string$cwd
[, array $env
[, array $other_options
]]] )類似 popen() 函式, 但是 proc_open() 提供了更加強大的控制程式執行的能力。
引數 ¶
cmd
-
要執行的命令
descriptorspec
-
一個索引陣列。 陣列的鍵表示描述符,陣列元素值表示 PHP 如何將這些描述符傳送至子程式。 0 表示標準輸入(stdin),1 表示標準輸出(stdout),2 表示標準錯誤(stderr)。
陣列中的元素可以是:
- 包含了要傳送至程式的管道的描述資訊。 第一個元素為描述符型別, 第二個元素是針對該描述符的選項。 有效的型別有:pipe (第二個元素可以是: r 向程式傳送該管道的讀取端,w 向程式傳送該管道的寫入端), 以及 file(第二個元素為檔名)。
- 表達一個真實檔案描述符的流資源型別 (例如:已開啟的檔案,一個 socket 埠,
STDIN
)。
檔案描述符的值不限於 0,1 和 2,你可以使用任何有效的檔案描述符 並將其傳送至子程式。 這使得你的指令碼可以和其他指令碼互動操作。 例如,可以通過指定檔案描述符將密碼以更加安全的方式 傳送至諸如 PGP,GPG 和 openssl 程式, 同時也可以很方便的獲取這些程式的狀態資訊。
pipes
-
將被置為索引陣列, 其中的元素是被執行程式建立的管道對應到 PHP 這一端的檔案指標。
cwd
-
要執行命令的初始工作目錄。 必須是 絕對 路徑, 設定此引數為
NULL
表示使用預設值(當前 PHP 程式的工作目錄)。 env
-
要執行的命令所使用的環境變數。 設定此引數為
NULL
表示使用和當前 PHP 程式相同的環境變數。 other_options
-
你還可以指定一些附加選項。 目前支援的選項包括:
-
suppress_errors (僅用於 Windows 平臺): 設定為
TRUE
表示抑制本函式產生的錯誤。 -
bypass_shell (僅用於 Windows 平臺): 設定為
TRUE
表示繞過 cmd.exe shell。
-
suppress_errors (僅用於 Windows 平臺): 設定為
返回值 ¶
返回表示程式的資源型別, 當使用完畢之後,請呼叫 proc_close() 函式來關閉此資源。 如果失敗,返回 FALSE
。
更新日誌 ¶
版本 | 說明 |
---|---|
5.2.1 | 為 other_options 引數增加 bypass_shell 選項。 |
範例 ¶
Example #1 proc_open() 例程
<?php
$descriptorspec = array(
0 => array("pipe", "r"), // 標準輸入,子程式從此管道中讀取資料
1 => array("pipe", "w"), // 標準輸出,子程式向此管道中寫入資料
2 => array("file", "/tmp/error-output.txt", "a") // 標準錯誤,寫入到一個檔案
);
$cwd = `/tmp`;
$env = array(`some_option` => `aeiou`);
$process = proc_open(`php`, $descriptorspec, $pipes, $cwd, $env);
if (is_resource($process)) {
// $pipes 現在看起來是這樣的:
// 0 => 可以向子程式標準輸入寫入的控制程式碼
// 1 => 可以從子程式標準輸出讀取的控制程式碼
// 錯誤輸出將被追加到檔案 /tmp/error-output.txt
fwrite($pipes[0], `<?php print_r($_ENV); ?>`);
fclose($pipes[0]);
echo stream_get_contents($pipes[1]);
fclose($pipes[1]);
// 切記:在呼叫 proc_close 之前關閉所有的管道以避免死鎖。
$return_value = proc_close($process);
echo "command returned $return_value
";
}
?>
以上例程的輸出類似於:
Array ( [some_option] => aeiou [PWD] => /tmp [SHLVL] => 1 [_] => /usr/local/bin/php ) command returned 0
註釋 ¶
Note:
Windows 相容性:超過 2 的描述符也可以作為可繼承的控制程式碼傳送到子程式。 但是,由於 Windows 的架構並不將檔案描述符和底層控制程式碼進行關聯, 所以,子程式無法訪問這樣的控制程式碼。 標準輸入,標準輸出和標註錯誤會按照預期工作。
Note:
如果你只需要單向的程式管道, 使用 popen() 函式會更加簡單。
謀膽並重
相關文章
- 從0到1優雅的實現PHP多程式管理PHP
- 程式內優雅管理多個服務
- 優雅的程式碼
- 用 PHP 玩轉程式之二 — 多程式 PHPServerPHPServer
- 優雅地亂玩Redux: Getting StartedRedux
- PHP介面與性狀的優雅應用PHP
- 如何讓git優雅的使用php-cs-fix格式化程式碼GitPHP
- 教你如何使用 PHP 優雅的生成 PDF 和 ImagePHP
- 玩轉 React(三)- JavaScript程式碼裡寫HTML一樣可以很優雅ReactJavaScriptHTML
- 如何優雅的打包前端程式碼前端
- 如何寫出優雅的程式碼?
- 寫出優雅的js程式碼JS
- PHP的pcntl多程式PHP
- 編寫更優雅的 JavaScript 程式碼JavaScript
- Laravel 5.6 中優雅的管理 swoole 程式Laravel
- Dotnet Core多版本API共存的優雅實現API
- 優雅的PromiseKitPromise
- 如何優雅的搞垮伺服器,再優雅的救活伺服器
- 如何寫出優雅耐看的JavaScript程式碼JavaScript
- Go程式設計技巧–Goroutine的優雅控制Go程式設計
- 你的 JS 程式碼本可以更加優雅JS
- 那些優雅靈性的JS程式碼片段JS
- 編寫優雅程式碼的最佳實踐
- 如何優雅的討好程式設計師?程式設計師
- 程式中的敏感資訊如何優雅的處理?
- java優雅的處理程式中的異常Java
- 如何運用多階構建編寫優雅的DockerfileDocker
- PHP多程式(4) :內部多程式PHP
- 優雅地除錯線上程式碼除錯
- 探索 PHP 多程式PHP
- 優雅的使用UITableViewUIView
- 【優雅程式碼】07-spring下的優秀工具類Spring
- 如何提高Java程式碼質量-優雅的寫程式碼Java
- 程式碼質量管理——如何寫出優雅的程式碼
- 論程式設計師如何優雅的聽歌程式設計師
- golang如何優雅的編寫事務程式碼Golang
- DSL-讓你的 Ruby 程式碼更加優雅
- 我是如何將業務程式碼寫優雅的