2015-04-23 44 views
3

我有什麼:如何網頁和實際程序之間交互

  • 程序的服務器(Linux版)(C++)
  • 可以用命令行執行的程序參數
  • 一段時間後,在程序完成併產生汽車無輸出(「log.txt中」)

我想要什麼:

我的想法是有一些類型的用戶互動與程序:

  1. 用戶打開一個網站,該網站顯示了一些輸入(複選框等)
  2. 提交後(POST)到服務器該程序應該從選擇的設置開始
  3. 運行log.txt時,應該向用戶顯示程序所做的更改
  4. 完成後應該發生一條消息(例如「Done」)

什麼是最好的方法?我目前的想法是開始後臺進程(php execute a background process)並監視進程ID。但是,我不知道如何動態監控php的過程,如何向用戶顯示log.txt輸出或如何告訴用戶程序已經完成,因爲這些東西不是靜態的而是動態的。

我用C++很好,但我的HTML和PHP技能是基本的。也許我需要進一步的技術呢?

+0

Btw。這不是太寬泛。我正在尋找在網站和程序之間進行交互的一般方法,因爲我沒有找到有關這方面的信息。 – Anonymous

+0

用於C++程序和PHP腳本的通用數據庫? PHP腳本使用C++將搜索的請求創建文件? PHP開始其他程序與參數打磨到它將能夠發送信號或使用任何其他IPC方法? http://en.wikipedia.org/wiki/Inter-process_communication – senfen

+0

只要你知道你有什麼樣的服務器(無論是Linux或Windows),這當然可以使用PHP來完成。您可能會喜歡的另一個非常有趣的解決方案,但可能比這更復雜一點,它使用的是nodejs服務器。這將允許您在客戶端和服務器之間進行(幾乎)實時的通信,這是您可能想要完成的事情,據我所見(點3) – briosheje

回答

1
<?php 

ob_implicit_flush(true); 
ob_end_flush(); 

$cmd = "your_program -{$_POST[option1]} -{$_POST[option2]}"; 

$descriptorspec = array(
    0 => array("pipe", "r"), 
    1 => array("pipe", "w"), 
    2 => array("pipe", "w") 
); 
flush(); 
$process = proc_open($cmd, $descriptorspec, $pipes, realpath('./'), array()); 
echo "<pre>"; 
if (is_resource($process)) { 
    while ($s = fgets($pipes[1])) { 
     print $s; 
     flush(); 
    } 
} 
echo "</pre>"; 

proc_close(); 

echo 'Proc finished!'; 

作爲回答here,但有一些修改。

+0

這種方法似乎是正確的。而不是proc_close();你必須使用proc_close($ process);.此外,我可以看到我的程序已經執行(發生日誌文件)。儘管如此,fgets($ pipes [1])沒有收到任何輸出。我的程序使用std :: cout,這裏可能是錯誤的? – Anonymous

+0

嗯有趣的問題。你是否直接在txt文件中寫出輸出,或者當你執行它時,你也可以看到輸出爲控制檯嗎? – mariobgr

+0

我犯了至少一個錯誤:我用clog代替cout。此外,我不確定是否將路徑添加到可執行文件必須添加到Linux PATH。儘管如此,經過這兩次改變,它正在工作! – Anonymous

相關問題