2011-03-13 146 views
6

我嘗試在後臺運行php進程,並從一個php文件啓動。nohup:在後臺運行PHP進程

一些信息:PHP版本5.2.17,php safe_mode關閉,linux系統。我用exec啓動進程,已經嘗試shell_exec。我的所有文件設置爲0755,0777

$pid = exec("nohup $cmd > /dev/null 2> /dev/null & echo $!"); 

如果我打印此聲明,我得到這個和PID是好的:

nohup /usr/local/bin/php5 /.../../file.php > /dev/null 2> /dev/null & echo $! 

如果我找下SSH與流程

top 

我看到我的php5過程正確的PID。用戶是根

PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND                      
3533 xxxxxxxx 20 0 21356 8868 4580 S 0 0.4 0:00.13 php5                       
3536 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5                       
3539 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5                       
3542 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5                       
3545 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5                       
3548 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5                       
3551 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5  

如果我開始處理人工上部看起來像這樣:

PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
8141 xxxxxxxx 22 2 24048 9.9m 5344 S 10 0.5 0:00.31 php5 

問題: 好像也沒什麼happens.To調試一點點我寫了一個輸出文件

ob_start(); 
echo "STARTING..."; 
writeLog(ob_get_contents()); 
//... 
function writeLog($info){ 
    $handle = fopen("file.log", "a+"); 
    fwrite($handle, $info); 
    fclose($handle); 
} 
exit; 

沒有在我的文件中的日誌。如果我在瀏覽器中啓動該文件,它會正確處理並獲取我的file.log文件中的「調試」信息。

爲什麼這是在瀏覽器而不是在exec/shell_exec命令?!我有正確的PID這些PHP進程,但沒有結果。

非常感謝您的幫助!

+0

您應該先嚐試提供您嘗試執行的腳本的絕對路徑,而不是像您現在似乎在做的相對路徑。 IE瀏覽器。使用'nohup/usr/local/bin/php5 /absolute/path/to/file.php>/dev/null 2>/dev/null&echo $!' – wimvds 2011-03-13 09:51:30

+0

我有這個文件的絕對路徑。我可以從ssh中的每個目錄啓動nohup。它的工作。不幸的是不使用PHP。 – stoe 2011-03-13 09:58:02

+0

然後它可能是一個權限問題。因此,請檢查您的日誌(Apache,php錯誤日誌,控制檯日誌)......如果您正在運行AppArmor/SELinux,請嘗試關閉它以測試是否需要更改安全策略以允許執行這些後臺任務。 – wimvds 2011-03-13 10:26:09

回答

1

PHP CLI環境可以不同於Web環境(mod_php,FCGI,不管)。當從命令行運行腳本時,腳本完全有可能死掉,而不是通過Web服務器調用腳本。調試你的腳本。如果可以,請通過SSH連接到您的服務器,然後連接到Web服務器用戶,並自行從命令行運行腳本。

如果你不能做到這一點,建立你自己的開發服務器,你可以做到這一點(如果你知道一些Linux,這並不難)。