基本上,我有一个套接字和一个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 秒,我不介意。
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
}
}
回到这个晚了,但你也可以在你的循环中添加这样的东西:
if(time() % 10 === 0) { /* your_func(); */ }