2010-02-20 106 views
0

我這個代碼分叉:PHP PHP分叉-FPM與pcntl_fork()

echo "1. posix_getpid()=".posix_getpid().", posix_getppid()=".posix_getppid()."\n"; 

$pid = pcntl_fork(); 
var_dump($pid); 
if ($pid == -1) die("could not fork"); 

if ($pid) { 
//parent 
echo "2. pid=".$pid.", posix_getpid()=".posix_getpid().", posix_getppid()=".posix_getppid()."\n"; 
} else { 
//child 
$sid = posix_setsid(); 

if ($sid < 0) 
exit; 

echo "3. pid=".$pid.", posix_getpid()=".posix_getpid().", posix_getppid()=".posix_getppid()."\n"; 

$fp = fopen("/tmp/testfile", "w"); 
fwrite($fp, '$data'); 
fclose($fp); 

} 

出於某種原因,有時else塊被髮送給瀏覽器,有時如果($ PID)塊顯示。

我想實現的是發送一些響應,然後在與客戶端的連接關閉後繼續處理。然後在請求後處理完成後最後關閉。如果我睡在孩子或父母的請求掛在那裏。

雖然這兩個部分都在執行,但在確定將哪些內容發送到瀏覽器時很奇怪。

在此先感謝。

回答

0

請考慮使用ignore_user_abort()代替。

+0

我可以明確關閉連接嗎?因爲看起來連接到客戶端一直保持到用戶中止。 – Chris 2010-02-20 02:55:35

2

實際上,您應該使用fastcgi_finish_request()將響應發送到瀏覽器,然後繼續在後臺工作。請記住,這隻適用於使用PHP-FPM。

注意:fastcgi_finish_request()函數沒有記錄在PHP手冊中(參見錯誤61449),但使用非常簡單。

至於ignore_user_abort(),對php.net的一些評論建議使用Content-Length: 0標題,但這會在將SSL與Internet Explorer結合使用時導致問題。