2013-07-06 52 views
0

我想在後臺運行一個php腳本,因爲它需要很多時間,我不想等待它。如何在後臺運行一個php進程?

這個問題涉及到:

php execute a background process

我試圖讓我的Linux CentOS的機器上這項工作,但不幸的是它似乎並不奏效。

這是我的代碼:

$cmd = 'php '.realpath($_SERVER["DOCUMENT_ROOT"]).'/test/sample.php'; 

exec(sprintf("%s > %s 2>&1 & echo $! >> %s", $cmd, $outputfile, $pidfile)); 
exec(sprintf("$s > $s 2>&1 & echo $1", $cmd, $outputfile),$pidArr); 

sleep(2); 

print_r($outputfile); 
print_r($pidfile); 

我包括睡眠(2)以確保sample.php腳本完成。 sample.php只包含echo'Hello world';我嘗試了兩個exec選項,但都沒有工作。上面的腳本不顯示任何輸出。

我試圖在linux命令行中運行相同的$ cmd,它向我展示了sample.php腳本的輸出。

我想先做這個運行,但另外我想發送變量到sample.php腳本。

非常感謝您的幫助。

+1

令牌/ cron:令牌可以是文件或數據庫條目中的一行或類似的東西,長期運行的cron作業搜索並控制其行爲通常是運行後臺的理想選擇來自瀏覽器的進程。管理員可以更好地控制cron作業運行的頻率,它擁有的權限以及它在做什麼。 – Paul

+0

謝謝,但我想在用戶訪問此php腳本時立即運行它。 – BastiaanWW

回答

2

可以使用set_time_limit(0)來允許腳本無限期地運行,並且ignore_user_abort()可以在後臺繼續運行腳本,即使關閉了標籤的瀏覽器。這樣,如果將瀏覽器重定向到其他位置,腳本將繼續在後臺運行。

+0

不知道'ignore_user_abort'是否可以工作,因爲運行exec將不會創建一個tty。另外,根據腳本的作用,最終可能會產生大量長時間運行的腳本。 –

0

我做了一些調整

$cmd = 'php '.realpath($_SERVER["DOCUMENT_ROOT"]).'/test/sample.php'; 
$outputfile = 'ouput.txt'; 
$pidfile = 'pid.txt'; 
exec(sprintf("%s > %s 2>&1 & echo $! >> %s", $cmd, $outputfile, $pidfile)); 
exec(sprintf("$s > $s 2>&1 & echo $1", $cmd, $outputfile),$pidArr); 

sleep(2); 

print_r(file_get_contents($outputfile)); 
print_r(file_get_contents($pidfile)); 

,如果你之前定義的變量不知道。我在Windows上測試它,它工作

1

這種方法在後臺運行php腳本似乎有點尷尬。取決於是否通過基於用戶輸入的其他參數,還可能創建一個攻擊者可以注入附加命令的場景。

對於像這樣的用例,如果您不需要立即響應,您可以使用cron,或者使用像Gearman這樣的工作管理器,您可以使用Gearman服務器來管理我們請求和背景工作。