По сути, у меня есть сокет и цикл 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 работает очень плохо, когда пытается что-то делать в реальном времени. Что вы можете сделать, это получить время до начала цикла, подождать немного после того, как ваш код будет выполнен (чтобы предотвратить огромную загрузку процессора) и получить время после этого:
$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(); */ }