PHP 函式proc open筆記

2021-09-22 19:33:26 字數 2005 閱讀 5188

雙管道,多執行緒執行命令: 使用示例:

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...