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

时间:2014-11-22 16:19:15

标签: php sockets loops delay

基本上,我有一个套接字和一个while循环来不断获取它的数据,如下所示:

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]\r\n"); } //respond to server
}

现在,我还想每10秒执行一次函数来重置一些变量。如何在不真正阻止循环的情况下执行此操作?如果它被阻止了0.1秒,我就不介意了。

2 个答案:

答案 0 :(得分:0)

PHP在尝试实时工作时表现非常糟糕。你可以做的是在循环开始之前获取时间,在代码执行后稍等一下(以防止巨大的CPU负载)并在此之后得到时间:

$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]\r\n"); } //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 :(得分:0)

回到这个晚了,但你也可以在你的循环中添加这样的东西:

if(time() % 10 === 0) { /* your_func(); */ }