2012-03-29 170 views
2

我的項目需要使用if-else條件運行的3個php腳本。第一個腳本將加載到站點的索引頁面上,以檢查是否設置了條件,如果是,則會調用第二個腳本。第二個腳本檢查是否設置了其他條件,如果一切正常,它最終會調用最後一個腳本。php shell_exec()幫助需要在後臺運行腳本

現在我可以通過將腳本包含在if語句中來做到這一點,但由於最終結果是資源佔用MySQL轉儲,我需要它獨立於原始觸發器頁面運行。

此外,無論索引頁面上的用戶操作如何,這些腳本都應該在觸發後繼續執行其操作。

最後一件事:它應該能夠在win和nix上運行。

你會如何做到這一點?

以下代碼是否有意義?

if ($blah != $blah-size){ 
shell_exec ('php first-script.php > /dev/null 2>/dev/null &'); 
} 
//If the size matches, die 
else { 
} 

非常感謝。

更新:以防萬一其他人正在經歷同樣的交易。 在將腳本作爲CGI運行時,php似乎存在一個錯誤,但Apache中的命令行可以與我測試過的所有版本一起工作。

看到錯誤https://bugs.php.net/bug.php?id=11430

所以不是我所說的腳本是這樣的:

exec("php-cli mybigfile.php > /dev/null 2>/dev/null &"); 

或者你可以把它作爲外殼。它適用於nix系統,但我的本地窗口是絕望的,所以如果有人在Windows上運行它,它的工作原理,請更新。

+0

創建另一個腳本工作者,由cron/windows調度器運行 – zerkms 2012-03-29 20:53:06

+0

這個的全部重點是不使用cron並且被用戶觸發。:) – Chris81 2012-03-30 14:31:03

回答

1

我能想到的最簡單的方法是,你可以做

EXEC(「屏幕-d -m PHP運行時間長,script.php的」);

然後它會立即返回並在後臺運行。屏幕將允許您連接到它並查看發生了什麼。

你也可以用'nohup php long-running-script.php'來做你正在做的事情,或者通過編寫一個簡單的C程序來完成daemonize(),然後執行你的腳本。

+0

請參閱下面請 – Chris81 2012-03-29 21:40:09

+0

exec(" screen -d -m php myfile.php "); 無法使用我自己的代碼。如果我自己在瀏覽器中運行每個腳本,他們會做他們應該做的事情,但不是全部都鏈接在一起。對於nohub它會像 exec('nohup php myfile.php >/dev/null &'); ?謝謝 對不起,我不得不回答我的問題,因爲代碼被搞亂了。 – Chris81 2012-03-29 21:45:37

+0

我不明白你的意思是「連接在一起」..對於nohup - 是的,這是正確的方式(它主要是指「運行這個應用程序,不要告訴它,它的終端已經消失了(不要通過HUP信號))對於'屏幕'的東西不能工作 - 它可能沒有安裝在機器上 – 2012-03-29 21:51:28

4

我不會用shell exec來做這件事,因爲你無法控制這些資源佔用過程中有多少會在任何時候運行。因此,用戶可以點擊單擊並單擊並基本停止您的機器。

相反,我會建立一個工作隊列。該腳本不是直接運行轉儲,而是將某個記錄提交給某種類型的FIFO隊列(可能是數據庫表或某處的某個文本文件),然後立即返回。接下來,您將有一個定期運行的cron腳本,並檢查隊列以查看是否有任何工作要做。如果是這樣,它挑選最古老的東西,並運行它。這樣,你可以放心,你一次只能運行一次轉儲。

+0

嗨,亞歷克斯,腳本是制約檢查與數據庫表檢查時間間隔,數據庫的大小和一些更多的東西。沒有辦法,用戶可以啓動相同的工作,如果它已經完成給定的條件。else語句會在數據庫連接失敗的情況下終止數據庫連接。Cron作業完全沒有問題,因爲它被設置爲在沒有設置cron選項卡的情況下運行任何設置。 – Chris81 2012-03-29 21:04:15