dongyulan6251 2014-11-22 16:19
浏览 178
已采纳

在循环中每10秒调用一次函数

Basically, I have a socket and a while loop to constantly get it's data, like this:

while (TRUE)
{ 
    $read = fgets($fp); //get data
    if (preg_match("/:(\S+)!\S+@\S+ JOIN (#\S+)/i", $read, $match)) { user_joined($match[1],    $match[2]); } //JOIN
    if (preg_match("/:(\S+)!\S+@\S+ PART (#\S+)/i", $read, $match)) { user_parted($match[1], $match[2]); } //PART
    if (preg_match("/:(\S+)!\S+@\S+ PRIVMSG (#\S+) :(.*)/i", $read, $match)) { inc_message($match[1], $match[2], $match[3]); } //MESSAGE
    if (preg_match("/:jtv!jtv@\S+ PRIVMSG $nick :(\S+)/i", $read, $match)){jtv_error($match[1]);} //JTV WARNING
    if (preg_match("/PING :.*/i", $read, $match)) { fwrite($fp, "PONG :$match[1]
"); } //respond to server
}

Now, I also want to execute a function every 10 seconds to reset some vars. How can I do this without really blocking the loop? If it's blocked for like 0.1 seconds I don't mind.

  • 写回答

2条回答 默认 最新

  • dongshan4878 2014-11-22 16:44
    关注

    PHP performs quite badly when trying to do realtime stuff. What you could do is get the time before the beginning of the loop, wait a bit after your code has executed (to prevent huge CPU load) and get the time after that :

    $timeCursor = microtime(true);
    
    while (TRUE)
    { 
        $read = fgets($fp); //get data
        if (preg_match("/:(\S+)!\S+@\S+ JOIN (#\S+)/i", $read, $match)) { user_joined($match[1],    $match[2]); } //JOIN
        if (preg_match("/:(\S+)!\S+@\S+ PART (#\S+)/i", $read, $match)) { user_parted($match[1], $match[2]); } //PART
        if (preg_match("/:(\S+)!\S+@\S+ PRIVMSG (#\S+) :(.*)/i", $read, $match)) { inc_message($match[1], $match[2], $match[3]); } //MESSAGE
        if (preg_match("/:jtv!jtv@\S+ PRIVMSG $nick :(\S+)/i", $read, $match)){jtv_error($match[1]);} //JTV WARNING
        if (preg_match("/PING :.*/i", $read, $match)) { fwrite($fp, "PONG :$match[1]
    "); } //respond to server
    
        usleep(50000); // do nothing for 50 ms
    
        $currentTime = microtime(true);
        if ($timeCursor + 10 <= $currentTime) {
            $timeCursor = $currentTime;
            // here you can call a function every 10s
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?