PHP 函數proc_open筆記


之前寫過一個爬蟲demo(現在叫爬蟲感覺有點勉強,啥都沒有的那種),沒有異步,必須等待 http 請求返回后,再進行內容解析,解析的時候也無法進行 http 請求

爬蟲 demo 現在還沒有異步,沒有錯誤處理,啥都沒有

然后之前參與的一個項目,用過 workerman 做過 websocket 的服務器,稍微瞟過一點源碼,開啟子進程是用的 proc_open 函數

windows環境沒有pcntl庫,想試一試用proc_open實現最基礎的功能,進程共享/交互使用redis或者干脆用mysql算了
函數原型
resource proc_open ( string $cmd , array $desc , array &$pipes [, string $cwd [, array $env [, array $other_options ]]] )

重點是 $desc 這個參數,內容是三個 資源流(resoure stream)[目前理解為和 fopen 返回的是同一類東西]

  1. $desc[0] 是子進程的 STDIN , 往里面寫入內容,子進程可以通過讀取他自己的STDIN獲取到內容

  2. $desc[1] 是子進程的 STDOUT, 子進程的輸出(echo,print_r,var_dump()等等),都會寫入到$desc[1] 所代表的資源里面

  3. $desc[2] 是子進程的 STDERR,錯誤輸出,可以自主寫入內容,暫時不明白進程退出會寫入什么東西,拋出的異常信息好像不會寫入到這個里面

下面貼一個自己的demo,因為目前還不知道如何判斷當前是否子進程(不通過命令行參數的情況下),所以子進程是啟動的不同的文件

#filename main.php //主進程文件,輸出時間(子父進程會sleep的關系,所以可能不會和當前時間相同,差距 2s 以內) $child_file = "child.php"; $descriptorspec = array( 0 => array("pipe", "r"), // 標准輸入,子進程從此管道中讀取數據 1 => STDOUT, // 標准輸出,重定向子進程輸入到主進程STDOUT 2 => array("file", "error-output.txt", "a") // 標准錯誤,寫入到一個文件 ); $child_process = proc_open("php {$child_file}", $descriptorspec, $pipes); while(1){ $time = date("Y-m-d h:i:s"); fwrite($pipes[0], "main say {$time}\n"); sleep(2); } proc_close($child_process);
#filename child.php while(1){ while($stdin = fread(STDIN, 65535)){ echo "child get main : " . $stdin; sleep(2); } }

命令行輸入php main.php 會不停的輸出內容


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM