2017-01-02 73 views
0

我有一個很多(幾乎300個)舊的SVN倉庫使用git2svn遷移到git。來自PHP腳本的CMD - 獲取反饋

考慮到GOLANG和PYTHON後,我終於決定最簡單的方法就是使用PHP。可能是一個 可疑的決定,但它似乎很容易。

因此,在15分鐘後,我測試中或多或少運行良好的。醜陋的腳本,但它是一個計時器。

問題是,該過程需要大量的時間,即使對於簡單的空白回購也可能需要30秒。甚至一分鐘。在大的 - 甚至10分鐘 - 所以在投入生產之前,我想要有一些反饋機制 - 所以我可以真正看到發生了什麼。

現在..as,腳本輸出像這樣的命令反饋:

$cmd = "cd ".$GITrepoPath." && svn2git svn://127.0.0.1/". $repoName . " --username " .$SVNusername ." --authors authors.txt --notags --nobranches --notrunk"; 
      $output = shell_exec($cmd); 
      echo "<pre>$output</pre>"; 

..但是這只是後各回購是成品加工..不是我能像真正的cmd執行請參閱步驟。

我發現可能接近我所需要的唯一的問題是here - 但說實話 - 我沒明白從答案了...

我知道這僅僅是一個計時器腳本 - 但這個用例讓我感興趣的是如何真正實現這個目標(如果可能的話)。

我在一臺win7本地機器上,但如果可能的話,也希望知道* nix。

回答

0

我建議在運行命令的後臺運行腳本或程序,然後更新數據庫中的記錄,然後可以使用AJAX或其他方式輪詢服務器以進行記錄更改。這爲用戶提供了一個很好的環境。

數據庫表中的列可以被命名爲「finished」,並且一旦該布爾值爲true,那麼您知道它是完整的,並且輸出可以存儲在數據庫中。

0

shell_exec等待過程關閉。您必須創建流程並聽取它,與CMD一樣。使用exec這樣的功能:

$cmd = ''; // your command here 
$output_storage = []; 
$output_showed = []; 
$result = null; 
exec($cmd, $output_storage, $result); 
while($result === null){ 
    $diff = array_diff($output_storage, $output_showed); 
    if($diff){ 
     // all new outputs here as $diff 
     $output_showed = $diff; 
    } 
}