大兔的神密世界
  • search
  • apps
  • Sep 12, 2018
    ·
    1 min read
    課堂
    pcntl_fork();
    ┤課前廢話├─────────────────────────────────

      最近在幫iBunny改寫核心,其中一項改變不是有關使用者體驗的方面,是與通訊軟體方
    伺服器(下稱:Remote Server)進行通訊的程式要翻修。

      目前Chat Bot的串接方式是利用設定webhook的方式,我們必須告知Remote Server在
    Bunny Server上哪個位置是在接收消息的窗口,當使用者在APP上發出一條訊息Remote就
    會把訊息、ID等等資訊包裝起來發送給Bunny。

      以上不贅述。重點是目前處理方式是Bunny收到資訊後會先消化訊息→想怎麼回應→回
    覆使用者→回應Remote說"200 OK!"。基本上在流量小、程式正確…等等最佳狀況下這樣
    的方式是沒有問題的,但一旦有環節錯了,Remote跟Bunny的連線就會超時中斷,持續發
    生的話Remote就會把Bunny當作壞了中斷串接。

    ┤課前簡介├─────────────────────────────────

      一般在 unix-like 的作業系統下,要寫多程序程式一定會用到fork。在 PHP 裡也不例
    外,若要在 PHP 中建一個子程序,要叫用 pcntl_fork()函式。

      把pcntl_fork用在iBunny的話就是先請父程序回應Remote並關閉連線再叫子程序負責回
    應使用者。

    ┤範例寫法├─────────────────────────────────

    01 <?php
    02  $pid = pcntl_fork();
    03  if($pid == -1){
    04    die("Fork fail.");
    05  }else if($pid){
    06    //父程序
    07    echo "Father start...<br />";
    08    sleep(5);
    09    echo "Father end...<br />";
    10    exit;
    11  }else{
    12    //子程序
    13    for($i=1;$i<=3;$i++){
    14      echo "I am child ".$i."<br />";
    15    }
    16    exit;
    17  }
    18 ?>

    ┤輸出結果├─────────────────────────────────

    Father srart...
    I am child 1
    I am child 2
    I am child 3
    Father end...

    ┤  後記  ├─────────────────────────────────

      父程序與子程序會各自執行,父子各自的exit;也不會互相影響。
      範例中是子程序先結束,當然也可以運用成父先結束子繼續執行。

    ───────────────────────────────────────

    --
    ※ 發信站: 大兔的神密世界(BunnyBBS.tk), 來自: 114.27.21.75
    ※ 文章網址: https://www.bunnybbs.tk/article/M.1536762674.A.805
    ※ Ricas:轉錄至某隱形看板                                          10/17 11:05