time_limit; $last_heartbeat = time(); while (!connection_aborted() && time() < $expiration_time) { set_time_limit($this->exec_limit); try { $data = call_user_func($callback); if ($data !== NULL) { $this->send($data); $last_heartbeat = time(); } } catch (StopEventLoopException $th) { break; } // sleep and perform heartbeat to ensure connection is still alive for ($i = 0; $i < $this->interval; $i++) { if (time() >= $last_heartbeat + $this->heartbeat) { echo ": \n\n"; ob_end_flush(); flush(); $last_heartbeat = time(); } sleep(1); } } } /** * Send data to client encoded as JSON */ private function send(mixed $data): void { echo "data: " . json_encode($data); echo "\n\n"; // send data to stream ob_end_flush(); flush(); } }