2013-04-16 135 views
0

我必須在後臺執行php腳本(a.php)。我試過,但它不工作:PHP在後臺執行腳本

<? 
$cmd = "php /home/megad404/www/prove/a.php &> /dev/null &"; 
exec('/bin/bash -c "'.$cmd.'"',$output,$return); 
if($return===0) 
{ 
    echo 'Successful'; 
} 
else 
{ 
    echo 'Unsuccessful'; 
} 
?> 

它返回 「成功」,但它不執行a.php只會

a.php只會:

<? 
file_put_contents(date("s"),""); 
sleep(5); 
file_put_contents(date("s"),""); 
sleep(5); 
file_put_contents(date("s"),""); 
?> 

a.php只會寫一個文件每5秒鐘一次,並且它工作正常,除非我嘗試在第一個腳本的後臺執行它。

+0

PHP外殼腳本仍然** ** MUST有'<?php'在其中觸發PHP模式。否則PHP會將其視爲文本。記住:沒有像「php腳本」這樣的東西。只有那些有php代碼塊的文件。 –

+0

自從bash成功返回以來,您每次都獲得「成功」 - 也許與您無關。 – Fergus

+0

我知道,但是我應該怎麼做才能使它工作? – Megadv

回答

0

這只是爲我工作:

<?php 

$cmd = "/usr/bin/php /home/auser/a.php &> /dev/null &"; 
exec($cmd,$output,$return); 
sleep(30); 
if($return===0) 
{ 
    echo 'Successful'; 
} 
else 
{ 
    echo 'Unsuccessful'; 
} 
?> 

我救它作爲runa.php並在命令窗口中的PHP runa.php運行它。 它產生了3個文件。

運行a.php只會也是從cron作業工作:

]$ crontab -l 
18 * * * * /usr/bin/php /home/auser/a.php 

我把劇本中的web目錄,並發現我有一些寫作的問題。你可以在服務器日誌中看到什麼?

sudo tail -f /var/log/httpd/error_log 

如果從網絡瀏覽器中打a.php會怎樣?因爲你提到的腳本是755,但是目錄怎麼樣。也許它需要775或777進行測試,以便腳本可以寫入文件?

爲了測試我創建了一個子目錄「輸出」,改變a.php只會

<?php 
ini_set('date.timezone','America/New_York'); //without this it makes extra messages 

error_log("a.php putting contents", 0); 
file_put_contents("output/".date("s"),""); 
sleep(5); 
file_put_contents("output/".date("s"),""); 
sleep(5); 
file_put_contents("output/".date("s"),""); 
error_log("a.php done", 0); 
?> 

它無法寫入文件,直到我給寫權限的文件夾輸出中

sudo chmod 777 /var/www/html/output 

然後我發現了Apache用戶正在寫入文件:

~]$ sudo ls -l /var/www/html/output/ 
total 0 
-rw-r--r--. 1 apache apache 0 Apr 18 11:38 00 
-rw-r--r--. 1 apache apache 0 Apr 18 11:38 05 
-rw-r--r--. 1 apache apache 0 Apr 18 11:37 55 

所以我改變了輸出的所有者,在ord呃再次調低聽衆的意見。

~]$ sudo ls -lu /var/www/html/ | grep output 
drwxr-xr-x. 2 apache root 4096 Apr 18 12:21 output 

這也適用於現在:

~]$ sudo ls -l /var/www/html/output 
total 0 
-rw-r--r--. 1 apache apache 0 Apr 18 12:21 44 
-rw-r--r--. 1 apache apache 0 Apr 18 12:21 49 
-rw-r--r--. 1 apache apache 0 Apr 18 11:37 55 
+0

沒有任何變化...它返回成功,但沒有發生 – Megadv

+0

我跑了上面的變化,並得到了兩種方式的結果。可能睡眠足以讓其他腳本的時間運行。我不知道是否可以通過瀏覽器啓動並在後臺運行。克朗更好。 – ndasusers

+0

它不起作用......可能是服務器問題?是否有另一種方法在後臺運行腳本? – Megadv

1

你可以試着適應英里腳本。 查看命令shell_exec()不是exec()。首先返回所有,僅次於最後一行。

function run_in_background($Command, $Priority = 0) { 
     if($Priority) 
      $PID = shell_exec("nohup nice -n $Priority $Command > /dev/null & echo $!"); 
     else 
      $PID = shell_exec("nohup $Command > /dev/null & echo $!"); 
     return($PID); 
} 
    //Verifies if a process is running in linux 
function is_process_running($PID) { 
     exec("ps $PID", $ProcessState); 
     return(count($ProcessState) >= 2); 
} 

和示例

$PIDPHP=run_in_background("php -S 127.0.0.1:18086 ".__DIR__."/index.php"); // or any other process. 

if (is_process_running($PIDPHP)){ 
    exec("kill $PIDPHP"); 
}