雙管道,多執行緒執行命令: 使用示例:
test.php:
$descriptorspec=array(
0=>stdin,
1=>stdout,
2=>stderr
);$process=proc_open('mysql -u root -p',$descriptorspec,$pipes)
這樣 執行php test.php 看見的效果將和終端直接執行mysql命令一模一樣。
$descriptorspec說明, 它表述了執行命令的執行檔案獲得從哪兒獲得stdin以及stdout輸出到哪兒, stderr輸出到哪兒。
他一般有三種形式, 資源,管道,檔案
管道表示:
$descriptorspec=array(
0=>array('pipe','r'),
1=>array('pipe','w'),
2=>array('pipe','w'),
);管道操作:
if(is_resource($process))
while($ret=fgets[$pipes[2])
}注意事項:
1,讀取管道時,有時候不能用stream_get_contents獲得內容,必須用fgets, 這時候往往是因為命令執行檔案有while死迴圈,不能結束程序,stream_get_contents是程式結束程序後才能
讀取到。 而fgets 每次只讀取一行, 要求命令執行檔案輸出內容需要帶換行。 並且有時候需要用while語句迴圈來讀取, 因為fgets每次唯讀一行 這樣保證所有的都讀取完了。
2,再讀取管道時,往往會堵塞。但是不影響下面程式的執行。 如:
$ret=fgets($pipes[1]);//這裡有堵塞。
echo $ret;
fwrite($pipes[0],'content');//但是這裡可以執行。
這時候fgets 不能加while迴圈。
3,stream_set_blocking函式可以設定是否堵塞,但是不知道為什麼對管道好像不起作用。
4,將讀取內容加上空字串後才進行echo輸出的目的, 是將stderr, stdout等特殊型別的字串轉換為標準字串 ,不然有些程式將讀取不了這些字串,比如用 ob_get_clean() 有可能讀取不了。
public function __construct($cmd)
$status = proc_get_status($this->resource);
array
(
[command] => top
[pid] => 7985
[running] => 1
[signaled] =>
[stopped] =>
[exitcode] => -1
[termsig] => 0
[stopsig] => 0
)
switch($status['exitcode'])
public function errors()
while (is_resource($this->pipes[self::pipe_stderr]) && !feof($this->pipes[self::pipe_stderr]))
fclose($this->pipes[self::pipe_stderr]);
proc_close($this->resource);
return $msg;
}
PHP 函式proc open筆記
雙管道,多執行緒執行命令 使用示例 test.php descriptorspec array 0 stdin,1 stdout,2 stderr process proc open mysql u root p descriptorspec,pipes 這樣 執行php test.php 看見的效...
php學習筆記 函式
與其他語言類似,php函式可以傳參,可以有返回值,但也有不同之處,如變數函式 目錄 param number a param number b return number function add a,b echo add 10.5,11 21.5 引用傳參必須傳變數,不能傳常量。function ...
PHP學習筆記之PHP函式(三)
認識php函式 函式引數的傳遞 1.值傳遞 傳值 函式內對引數值的改變不會影響函式外部的值 2.引用傳遞 傳址 有些情況下,可能希望在函式體內對引數的修改在函式體外也能反映 3.預設引數值 可以為引數指定預設值,在沒有提供其他值的情況下,則將預設值自動賦 函式中變數的作用域 1.區域性變數 func...