2012-08-31 37 views
2

這是我的代碼,裏面index.php(只是一個例子):如何與Apache使用pcntl_fork()?

$pid = pcntl_fork(); 
if ($pid == -1) { 
    die("failed to fork"); 
} else if ($pid) { 
    // nothing to do 
} else { 
    putDataIntoWebService(); 
    exit(); 
} 
echo "normal page content"; 

這段代碼工作在命令行罰款。在Apache中exit()殺他們兩個,家長和孩子的過程。什麼是解決方法?

+0

請參閱http://stackoverflow.com/a/13105346/632951 – Pacerier

回答

1

這是解決方案:

posix_kill(getmypid(), SIGKILL); 

,而不是exit()

+2

正確的解決辦法是使用'pcntl_wait'父和令狀爲孩子rpocesses到結束,以避免殭屍。建議的解決方案可能會也可能不工作,這取決於孩子們的信號處理程序,對SIGKILL生產代碼中的進程SIGKILL並不真正「健康」,因爲您無法在SIGKILL上發出信號,因此您可能會遺留資源在空中或使程序處於不一致的狀態。 – gphilip

4

你不能用PHP的Apache模塊版本使用pcntl_*功能。從pcntl_fork documentation評論引述:

It is not possible to use the function 'pcntl_fork' when PHP is used as Apache module. You can only use pcntl_fork in CGI mode or from command-line.

Using this function will result in: 'Fatal error: Call to undefined function: pcntl_fork()'

+0

您指的是在php.net上的評論,而不是官方文檔的一部分。 'pcntl_fork()'不會工作在Apache中,但不創建一個正常的獨立進程,我猜。 – yegor256

+1

我以前嘗試過。我收到了評論描述的錯誤。 – Hubro

+0

你應該安裝'pcntl'擴展,然後 – yegor256