2016-09-12 20 views
-1

我想實現一個涉及2個C#應用程序的php服務,每個應用程序讀取其以前的應用程序的輸出並生成另一個輸出。我想知道這是否可以逐行實現,而不是需要線程或其他異步機制。如何保證PHP函數調用的順序?

用戶可以上傳在this webpage一個文本文件,從而導致uploadFile.php,目前寫法如下:

<?php 
copy($_FILES["file"]["tmp_name"], "uploads/" . $_FILES["file"]["name"]); 
$n1 = "uploads/" . $_FILES["file"]["name"]; 
echo "Uploaded: " . $n1 . "<br>"; 
exec("mono c1.exe $n1"); 
echo "After running c1.exe"; 
$n2 ="uploads/c1_" . $_FILES["file"]["name"]; 
exec("mono c2.exe $n2"); 
echo "After running c2.exe"; 
?> 

假設用戶上傳test.txt在網頁中,c1.exe使用的test.txt的內容和產生c1_test.txt,然後c2.exe使用c1_test.txt的內容並生成c2_test.txt

我的測試(只有1個用戶)顯示當前uploadFile.php可以逐步執行此任務。

但我不知道這是否可以由許多用戶啓動的Web服務的正確實施。

任何人都可以幫忙嗎?

編輯1:如果可以遵守執行順序,另一個問題是用戶是否必須等到他以前的用戶的所有任務都完成了?在c1.exec2.exe需要幾分鐘才能運行的情況下,沒有任何反饋的等待是令人討厭的。

那麼目前的方法是否允許多個用戶同時運行他們的任務(但對每個用戶而言都是正確的)呢?否則,我是否必須自己實現多線程?

+1

我看不出有任何問題與上面的方法。 – nogad

+0

讓我們假設'c1.exe'需要5分鐘運行。如果另一個用戶在用戶之後上傳文件會發生什麼?那邊有一個「隊列」嗎? – SoftTimur

+1

exec是阻塞的,除非你重定向輸出 – nogad

回答

0

您可以uniqueid工作:

<?php 
$name = uniqid(); 
copy($_FILES["file"]["tmp_name"], "uploads/" . $name); 
$n1 = "uploads/" . $name; 
echo "Uploaded: " . $n1 . "<br>"; 
exec("mono c1.exe $n1"); 
echo "After running c1.exe"; 
$n2 ="uploads/c1_" . $name; 
exec("mono c2.exe $n2"); 
echo "After running c2.exe"; 
?> 
+1

沒有隊列,這就是爲什麼我們必須讓所有文件具有不同路徑 – christophe

+0

因此,默認情況下,服務器可能會同時處理來自不同用戶的同時請求? – SoftTimur

+1

不,你將有一個進程,每次調用uploadFile.php將同時執行。但是如果這些文件有不同的名字,那麼就沒有問題 – christophe