Quase nunca utilizaremos o Long Polling para qualquer projeto.
Como você disse, o Long Polling foi uma tática usada para comunicar um cliente de alterações antes do websocket, porém existe opções melhores atualmente.
O Server Sent Events é a alternativa perfeita para quando não é necessário a complexidade de um websocket, mas ao mesmo tempo você quer manter a comunicação em tempo real
Ele funciona definindo um tipo de resposta como "text/event-stream" e enviando o conteúdo periodicamente no seguinte formato
event: NOME_DO_EVENTO
data: CONTEUDO_JSON
Com isso não há necessidade de fechar a conexão e abrir um novo request
<?php
// Headers necessários para o SSE
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('Connection: keep-alive');
// Desativa a compactação Gzip no servidor para evitar buffer de eventos
if (ini_get('zlib.output_compression')) {
ini_set('zlib.output_compression', 'Off');
}
// Desativa o tempo limite do PHP
set_time_limit(0);
while (true) {
$newMessage = getNewMessages();
if ($newMessage) {
// Formata os dados para o SSE
$data = json_encode($newMessage);
// Envia o evento 'messageCreate' para o cliente
echo "event: messageCreate\n";
echo "data: {$data}\n\n";
// Libera o buffer de saída do servidor para garantir que o evento seja enviado
ob_flush();
flush();
}
sleep(1);
}
?>
Essa alternativa é muito melhor que o Long Polling, sendo usada na API oficial do Docker ou até mesmo no próprio ChatGPT, que retorna sua resposta usando o SSE.
Contudo, é importante salientar: PHP não foi feito para trabalhar com conexões permanentes, usem sempre alguma outra linguagem para esses cenários