2012-05-12 75 views
1

我目前正在開發一個PHP UI,它收集信息,解析它,將它發送到另一個程序,收集輸出並將其呈現給用戶。在HTML/PHP中實現'kill'按鈕

通常它工作得很好。然而,有時候,其他程序可能會永遠完成(大約2到15小時之間,我讓它在一夜之間運行,並在早上結束)。我想實現一個KILL按鈕,允許用戶取消該程序,因爲這不僅需要永久完成,而且還要關閉服務器,並防止用戶在此期間執行其他任何操作。

目前設置的方式是這樣的: page1.php收集所有的用戶輸入。 page2.php檢查用戶輸入。 如果不好,它會打印錯誤。 如果輸入是好的,它解析它並通過系統調用將它發送到另一個程序。發生這種情況時,屏幕上會出現'正在計算...'的gif。一旦程序完成,輸出顯示在頁面上。

理想情況下,我希望kill按鈕在計算gif的同時(並且只能在同一時間)出現,並且我希望它能夠終止進程(並使輸出反映事實該過程被殺死)。

到目前爲止,我已經能夠讓按鈕出現在我想要的時間和地點。但是,我一直無法獲得我正在尋找的實際殺傷功能。目前,我已經設置了這個按鈕,使用帶按鈕執行的javascript函數的html按鈕。該javascript函數包含一個系統調用的php代碼,該系統調用找到目標進程並殺死它們(我知道系統調用正常工作,因爲我可以在終端窗口使用它,它工作得很好)。

下面是相關代碼:

startload("calculating"); 
$opt->run_optimization($output); 
stopload("calculating"); 

這飛架計算GIF和殺按鈕,然後運行一個功能,使得系統調用,然後刪除計算GIF和殺死按鈕。

system("./optimi/optimi < $infile > $outfile"); 

這是系統調用其他程序(optimi)。

print <<< KILLBUTTON 

<br/> 
<button type="button" onclick="kill();">Kill</button> 
<br/> 

<script type="text/javascript"> 
function kill(){ 
    <?php 
    system("ps -Af | grep optimi | grep -v grep | awk '{print $2}' | xargs sudo kill"); 
    ?> 
} 
</script> 

KILLBUTTON; 

這是我的殺死按鈕,它現在似乎沒有任何操作。

我要指出的是重寫優化解程序是我想不惜一切代價避免,考慮我不是誰寫它的人,我也不是經歷了它寫在程序設計語言。

謝謝。

+0
+0

我認真地建議您嘗試修復緩慢的程序,而不是僅僅添加一個哈克式的變通辦法。殺死流程中流可以爲您的數據做一些令人討厭的事情。它可能不是,但是你對這個計劃有足夠的瞭解嗎?如果數據仍然需要處理,那麼殺死它並不能解決任何問題,因爲您仍然需要在某個時間點運行腳本,而且它仍然需要很長時間。 – Spudley

回答

7

您似乎無法理解Web服務器如何與您的瀏覽器進行交互。

當你發送一個請求到Web服務器上運行PHP,Web服務器負載高達請求的文件,解釋任何相關的PHP代碼,然後將瀏覽器文本文件

如果在該文本文件中有javascript,那麼您的瀏覽器將嘗試解釋/執行它。你不能把php代碼放在一個javascript函數中,並希望當用戶做一些事情時執行它 - 當頁面被請求時,頁面上的所有php只執行一次。

如果您想運行php代碼以響應用戶交互,您需要爲php腳本設置一個ajax請求。

+1

但是,我基本上正在寫同樣的回覆,但這並不是真正的答案。即使你創建了一個腳本來做你想做的事情(這是不平凡的,因爲讓你的apache用戶能夠自己升級到root是一件非常危險的事情)的確,我不確定你會得到你想要的行爲 - - 這是系統()調用返回。如果這樣的話可以,那麼你可以做Sam用Ajax建議的內容(也許嵌入到「計算」圖像中,通過添加一個錨標籤來殺死該進程 – gview

+0

所以我嘗試了你的建議並創建了一個AJAX請求。 kill button仍然不起作用問題似乎是,在程序結束之前,服務器不會響應用戶的任何其他內容,即使他們嘗試裝載不同的頁面,它仍然會等待服務器。我如何已經得到了過去,這至今是通過終端發送kill命令自己。我希望往死裏按鈕能做到這一點,而不是我的,但它未。是否有具有程序執行中的一些方法這樣,服務器不必等待它做別的 – MattS

+0

@MattS - ?您可能需要將系統分成3個腳本,然後 - 一個「開始」按鈕,一個通用的UI頁面,發送AJAX請求運行該腳本,並「殺」butto n,它向kill腳本發送一個ajax請求。 –