2014-02-19 70 views
1

我使用名爲Philip的PHP bot框架構建了一個IRC bot(https://github.com/epochblue/philip)。當任何人將命令!hello發送到聊天室時,機器人應在通道中說出「hello ...」,等待45秒,說出「foo」,等待15秒,然後說出「bar」(我知道,沒有任何意義,只是試圖讓這個代碼工作)。使用sleep()延遲所有輸出

下面是我試過到目前爲止代碼:

嘗試#1

$bot->onChannel('/^!hello$/', function($event) { 
    $event->addResponse(Response::msg($event->getRequest()->getSource(), "hello...")); 
    $now = time(); 
    while ($now + 45 > time()) { 

    } 
    $event->addResponse(Response::msg($event->getRequest()->getSource(), "foo")); 
    while ($now + 60 > time()) { 

    } 
    $event->addResponse(Response::msg($event->getRequest()->getSource(), "bar")); 
}); 

嘗試#2

$bot->onChannel('/^!hello$/', function($event) { 
    $event->addResponse(Response::msg($event->getRequest()->getSource(), "hello...")); 
    sleep(45); 
    $event->addResponse(Response::msg($event->getRequest()->getSource(), "foo")); 
    sleep(15); 
    $event->addResponse(Response::msg($event->getRequest()->getSource(), "bar")); 
}); 

與這兩個這些嘗試中,在輸出任何東西之前,機器人會等待整整60秒。所以不是發送一條消息,然後等待,然後發送另一條消息,然後等待,然後發送第三條消息,它只是等待所有60秒,然後發送消息。

任何想法,我怎麼能得到這個工作,因爲我希望它?

感謝

+2

嘗試http://www.php.net/flush每封郵件後 – Reeno

+1

我不知道框架,但看代碼(https://github.com/epochblue/philip/blob/master/ src/Philip/Philip.php),它看起來像你想用send()方法發送單獨的響應(「實際上將數據推回套接字(giggity)」)。 – CompuChip

+0

@Reeno剛剛嘗試過。似乎沒有工作。 – 585connor

回答

0

睡眠凍結您當前的線程。 您應該做消息發送一個新的線程(和睡眠有造成主線程不凍結)使用「並行線程」或你應該使用一個計時器。

+0

這仍然沒有解釋(至少我明白)爲什麼sleep()之前發送的第一條消息被調用直到最後一次sleep()之後才顯示。在睡覺前應該等待成功嗎? – Anthony

+0

發送消息時,它實際上會被添加到「緩衝區」中。因爲你正在調用sleep,所以沒有時間來處理這個緩衝區。 –

0

如果你看一看的fwrite()文檔,它具有以下珍聞:

注意: 寫入網絡流寫入整個字符串前可結束。 ()的fwrite的返回值可以被檢查:

<?php 
function fwrite_stream($fp, $string) { 
    for ($written = 0; $written < strlen($string); $written += $fwrite) { 
     $fwrite = fwrite($fp, substr($string, $written)); 
     if ($fwrite === false) { 
      return $written; 
     } 
    } 
    return $written; 
} 

因此,在你Phillip::send方法,你可以納入一個類似的解決方案來保存方法,直到fwrite到插座完成並返回一個成功布爾等

+0

我不確定我是否瞭解您的解決方案。你能寫一些(僞)代碼,以便我能看到你的意思嗎? – 585connor