用nohup命令實現PHP的多進程


考核部分的數據計算需要大量的時間來保證,如果串行執行,等所有的計算結束再反饋結果,用戶體驗會非常不好,測試人員甚至和我說他以為這是一個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不到該變量,我也不知道這是怎么回事,希望有大神可以留言指點一二!感激不盡!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM