2010
03.26

Fork child processes 在 PHP 的寫法

有人在 PTT 問了一個問題:

作者 kovenkoven (小沃) 看板 PHP
標題 [請益] 幾個Plurk機器人的問題
時間 Thu Mar 25 18:51:22 2010
───────────────────────────────────────
..略..
由於最近對在嘗試寫Plurk的回訊機器人
..略..
我想在使用者發出關鍵字的噗之後才開啟回訊機器人進行動作
之後在回覆的地方抓使用者輸入的控制選項
例如A使用者發出了”呼叫OOO”的訊息
機器人會在該篇噗做出等待使用者下命令的訊息之後等待使用者的回覆
接著使用者可能會輸入”氣象”or”新聞”等等的訊息讓機器人做出相對應的事情
直到使用者發出”結束OOO”才停止函式
可是該怎麼做才能實現主程式持續抓時間河上的訊息且同時服務已呼叫機器人的使用者?
在win作業系統下有支援類似thread的功能嗎?
另外目前我所使用的方法是利用while搭配sleep讓它持續運作
有什麼方法可以讓我做個分頁,裡面有控制按鈕去讓他起動or停止嗎?
譬如利用while($key),讓我的按鈕可以去控制$key之類的
感謝各位^^

這個概念其實不難,雖然說用 PHP 實做不見得是個好主意。比較有效率的方法, 分成兩隻程式來跑,第一隻負責找最新的噗的關鍵字,找到之後把 plurk_id 存起來。第二隻負責去撈 plurk_id 來回應關鍵字。

    table scheme
    id   | plurk_id | start_time | hooked
    pk     整數       抓到的時間   TRUE/FALSE

在 fork 的同時把該筆 plurk_id 對應的欄位 hooked 設定為 FALSE

<?php
/*
    先去撈資料庫的資料, 找出有幾筆 plurk_id 要回,
    假設你撈出來的資料已經處理好了,像是下面醬子.
*/

$data = array(
    array("plurk_id" => 1, "tpye" => '打掃', "hooked", FALSE),
    array("plurk_id" => 2, "type" => '搥背', "hooked", FALSE),
    array("plurk_id" => 3, "type" => '偷懶', "hooked", FALSE),
    array("plurk_id" => 4, "type" => '喝茶', "hooked", FALSE),
);

$total_num = count($data);

for($i = 0; $i< $total_num; $i++)
{
    $pid = pcntl_fork();
    if($pid == -1)
    {
        exit('hey! orange.');
    }
    else if($pid)
    {
        echo "這邊可以把該筆 plurk_id 的資料標記為已經處理\n";
        echo "製造出第 " . $data[$i]['plurk_id'] ." 個 child process\n";
        // "UPDATE TABLE SET hooked = TRUE WHERE plurk_id = $data[$i]['plurk_id']";
    }
    else
    {
        break;
    }
}

if($pid)
{
    echo "end of parent process\n";
}
else
{
    test_case($data[$i]['plurk_id']);
}

function test_case($plurk_id)
{
    echo "你目前在分析 $plurk_id 。\n";
    sleep(rand(10, 20));
    echo "分析完畢 $plurk_id\n";
}

exit();
?>

1 comment so far

Add Your Comment
  1. [...] This post was mentioned on Twitter by roga. roga said: 剛剛等稀飯煮好的同時,看到一個有趣的問題,在 BBS 回完問題以後整理了一下貼到我的部落格上 http://blog.roga.tw/2010/03/26/2373 (Fork child processes 在 PHP… http://plurk.com/p/4cytp5 [...]

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>