關於部落格
雨--是天空的眼淚 風--是蝴蝶的痴醉 雲--是水珠的嫵媚 光--是溫暖的慰藉 夜--是孤單的滋味 星--是墜跌的心碎 蹲下,是為了躍起。 後退,是為了向前跳得更遠。
  • 167033

    累積人氣

  • 36

    今日人氣

    0

    訂閱人氣

PHP popen 背景

在web的應用上
難免有些功能和動作會需要比較長的時間
如果處理時間不需要太久的
像是在 5 秒以內
可能用個ajax loading效果就可以解決使用者的等待觀感


只是如果是需要長時間在server端做處理的動作
舉一個例子


之前在做Cloud專案時
虛擬機器建立的流程
1.使用者透過web介面選好虛擬機器規格
2.使用者按下建立機器
3.虛擬機器建立完成, 並更新前端狀態資訊


而在 2 和 3 之間
是需要一段時間進行虛擬機器建置, 設定等大約10幾分鐘的時間
如果依照傳統的做法
可能會讓使用者覺得是不是網頁當掉了
即使是使用ajax loading效果, 又有點不合適 ( loading轉個10分鐘有點怪


那要怎麼做好呢?
有沒有辦法把動作丟給server後
client可以馬上收到回應, 而server又可以持續把動作做完?


這個就是今天要介紹的PHP popen函式


popen函式
主要是可以開啟一個進程並回傳pointer


聽起來有點模糊
實際來看一個例子吧


<?php
    $command = '/usr/bin/php /var/www/httpd/memory.php &';
    pclose(popen($command, 'r'));
?>


&在linux指令是指背景執行的意思


要怎麼傳參數進去呢?
很簡單, 請看以下


<?php
    $command = '/usr/bin/php /var/www/httpd/memory.php abc 123 &';
    pclose(popen($command, 'r'));
?>


memory.php 要接收參數的話
可以使用$_SERVER["argv"]
第一個參數就是 $_SERVER["argv"][1]
之後依此類推


例如
<?php
    echo $_SERVER["argv"][1];
    echo "n";
    echo $_SERVER["argv"][2];
?>

輸出結果 :
abc
123


當然如果是CI架構的話傳接參數會更方便


最後
只要在memory.php執行完後, 更新前端的狀態
讓使用者知道這個工作已經完成

相信這樣會大大的增加前端反應速度
減少使用者的等待時間





文:葉小誠

相簿設定
標籤設定
相簿狀態