2012-06-08 27 views
0

我想運行並行進程來同時處理至少4個用戶。PHP PCNTL - 維護終端中的控制

ob_end_flush(); 

for($i = 0; $i < 4; $i++) 
{ 
    $pid=pcntl_fork(); 
    if ($pid == -1) { 
     echo("Could not create a new child."); 
     exit; 
    } else if ($pid == 0) { 
     //This will get excuted only in the child process 
     echo 'parent1'; 
     sleep(5); 
     echo 'parent2'; 
    exit; 
    } 
} 

輸出是這樣的:

> php testscript.php 
parent1 
parent1 
parent1 
parent1 
> parent2 
parent2 
parent2 
parent2 

什麼正在發生的事情是顯示parent1 4次上的腳本控制丟失,新的空命令行啓動後。等待5秒鐘後剩餘的輸出。

我該如何避免發生這種情況。我希望能夠隨時隨地打破腳本。

編輯

如果我按Ctrl + C發送的信號經終端說,腳本不停止,需要一種方式來通知腳本停止在那一瞬間。

+0

如何是你的「想」的腦電波傳送到PHP腳本?我不知道一個圖書館是否存在腦電波。你能否詳細說明,看起來像每個人都應該知道的非常酷的擴展。 – hakre

+0

修改了這個問題。要求是讓php腳本收聽終端發送的信號後發送睡眠。 – Rishabh

+0

像[如何禁用ctrl-z,ctrl-c從打破php腳本](http://stackoverflow.com/questions/2774331/how-to-disable-ctrl-z-ctrl-c-from -break-out-a-php-script)? – hakre

回答

1

你正在創建誰正在被別人採納

當你與派生工作,你需要了解你正在創建髒殭屍/家長少工藝誰肯定不希望他們要麼=)當前進程的一個副本(堆棧/堆和所有),給它一個新的進程ID(PID),並將其父進程ID(PPID)設置爲自己,以表示生成的進程是一個孩子。在這裏,這四個新孩子的父母完成了他所有的表面工作,然後毫無疑問地死去了,因爲他沒有什麼可做的事情了。但是,任何尊敬的父母都應該這樣做,你的父母過程應該坐在旁邊照顧他的孩子。這就是信號可以變得有用的地方,尤其是SIGCHLD信號,它將被髮送給任何剛剛過去的孩子的父母進程。結合,以極少的事件處理循環和您的父母可以優雅地管理他的孩子\ O/

TL;博士我有一個例子叉包裝坐在我的博客http://codehackit.blogspot.be/2012/01/childpids-break-pcntlsignaldispatch.html

+0

在博客中使用您的代碼,每個過程都在等待先前的過程首先完成。我的要求是獨立於前一個孩子完成或不完成這些過程。 – Rishabh

+0

這根本不是真的。請發佈一個如何使用它的例子,也許有客戶端錯誤。 – smassey

+0

是的,的確,這是我執行過程中的一個錯誤,非常好,謝謝 – Rishabh

0

如果您想以自定義的方式對它做出反應,則需要使用pcntl_signal爲CTRL-C設置信號處理程序(其值等於SIGINT,值爲2)。

+0

試過了,但徒勞無功。在第四次顯示parent1之後,會啓動一個新的終端行,因此在此之後按CTRL-C不會向PHP腳本發送任何信號。 – Rishabh