考核部分的數據計算需要大量的時間來保證,如果串行執行,等所有的計算結束再反饋結果,用戶體驗會非常不好,測試人員甚至和我說他以為這是一個bug,沒想到會要等這么久才出來結果。
所以作為開發就要開啟多進程,一邊讓后台計算結果,一邊反饋實時狀態。
這里就用到了:
system("nohup php *.php > /dev/null &");
nohup命令會開啟一個新的進程執行后面的PHP任務,*.php是要在后台執行的腳本文件。
這里有要一個要注意的地方,這一段 > /dev/null & 是不可缺少的, > /dev/null 表示立即將php的執行結果返回為空,如果不加,調用此命令的PHP會等待system調用的php頁面結果,達不到多進程的效果,&是nohup命令的結束的標示。
1 $rs = Exam_general::add($name, $starttime, $endtime, $idstr, $operator); 2 echo $rs; 3 system("nohup php {$FILE_PATH}commands/statistic_exam_general_check.php >/dev/null &");
第一句是將一條記錄插入數據庫,表示我要新建這樣的一個考核,此時的狀態設為2,也就是“等待創建的過程”。這樣一條記錄的插入當然費不了多少時間,$rs是返回的json語句,將其打印出來,通過ajax進行反饋。在此同時,我們也要調用系統進程,開始我們的大數據計算,在后台運行statistic_exam_general_check.php 腳本文件。
$updateSql = "update rongcheng110_exam_general set exam_general_status=3 where exam_general_id={$examId}";
在腳本文件的最后,執行這樣一條sql語句,可以將之前設為2的狀態更新成3,表示計算完成。
在view層,我們可以這樣表示:
1 if($row["status"]==Exam_general::SOLVED){ 2 echo '<a href="examdep_general_data.php?exam='.$row["id"].'">查看詳情</a>'; 3 } 4 else{ 5 echo $row["status"]==Exam_general::WAIT_SOLVE?"等待處理":"<font color='red'>正在處理</font>"; 6 }
Exam_general::SOLVED 表示數據庫字段3,更新完成,可以查看了。
Exam_general::WAIT_SOLVE 表示數據庫字段2,正在處理,無法查看。
這樣,就會有比較好的用戶體驗效果啦!
但是這里有一個問題,就是我在執行system() 函數時,想在執行文件后面加上 ?idstr = idstr 方便傳參,但是執行腳本卻get不到該變量,我也不知道這是怎么回事,希望有大神可以留言指點一二!感激不盡!