簡體   English   中英

php shell_exec()幫助,可在后台運行腳本

[英]php shell_exec() help needed for running a script in the background

我的項目要求使用if-else條件運行的3個php腳本。 第一個腳本加載到站點的索引頁面上,以檢查是否設置了條件,如果已設置,則調用第二個腳本。 第二個腳本檢查是否設置了其他條件,如果一切正常,則最后調用最后一個腳本。

現在,我可以通過僅將腳本包括在if語句中來執行此操作,但是由於最終結果是占用資源的MySQL轉儲,因此我需要使其獨立於原始觸發器頁面運行。

而且,無論索引頁面上的用戶操作如何,這些腳本一旦觸發就應繼續執行其操作。

最后一件事:它應該能夠在勝利和尼克斯上運行。

你會怎么做?

下面的代碼有意義嗎?

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 &"); 

或者,您可以將其稱為shell。 它可以在nix系統上運行,但是我的本地Windows絕望了,因此,如果有人在Windows上運行它並且可以運行,請進行更新。

我不會通過shell exec來執行此操作,因為您無法控制在任何一次運行這些資源占用過程中有多少個。 因此,用戶可以單擊,單擊,單擊,單擊並實質上停止計算機。

相反,我會建立一個工作隊列。 該腳本不是直接運行轉儲,而是將記錄提交到某種FIFO隊列(可以是數據庫表或dir中某個地方的文本文件),然后立即返回。 接下來,您將有一個cron腳本,該腳本定期運行,並檢查隊列以查看是否有任何工作要做。 如果是這樣,它將選擇最舊的東西並運行它。 這樣,可以確保您一次只運行一個轉儲。

我認為最簡單的方法就是您可以

exec(“ screen -d -m php long-running-script.php”);

然后它將立即返回並在后台運行。 屏幕將允許您連接到它,並查看發生了什么。

您還可以使用'nohup php long-running-script.php'或通過編寫一個簡單的C應用程序(執行daemonize()然后執行腳本)來執行操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM