Onde está o erro?

Enviada por Jefrey Sobreira Santos 
Jefrey Sobreira Santos
Onde está o erro?
09 de February de 2011 às 12:49PM
Este script fica em loop contínuo a cada segundo, verificando novo conteúdo no arquivo texto.txt e, se houver novidades, gravando no arquivo ultima.txt e mostrando na tela. Porém, ele só grava na primeira modificação. Da segunda em diante, não faz nada. Note que se retirar a parte responsável pelo salvamento do ultima.txt, ele funciona corretamente, mas não da maneira que eu quero. Onde está o erro neste bloco?
<code><?

header("Cache-Control: no-cache, must-revalidate");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");


// define o tempo limite do script (0 = infinto)
set_time_limit(0);

// executa o script ate o final independente do usuario sair da pagina
ignore_user_abort(true);

// envia algum dado antes de comecar a enviar o texto da pagina
for ($i = 0; $i<100; $i++)
echo " ";
// envia os dados do buffer pro usuario
flush();
ob_flush();


// enquanto o usuario estiver conectado, faz...
while (!connection_aborted()) {
$text = file_get_contents("texto.txt");
$ultima = file_get_contents("ultima.txt");
// ve se o texto atual já foi escrito
if (!$text==$ultima) {
// se o texto for novo, grava-o no arquivo temporario que sera consultado na proxima
$abre = fopen("ultima.txt", "w");
fwrite($abre, $text);
fclose($abre);
// mostra o texto com quebra de linha
echo $text."<br>";
}
// envia os dados do buffer pro usuario
flush();
ob_flush();

// "dorme" por 1 segundo
sleep(1);
}


?></code>
Marcos Regis
Re: Onde está o erro?
09 de February de 2011 às 01:18PM
Experimente colocar um echo "\r\n"; dentro do loop mas não use as funções de ob_* para que o Apache mantenha a conexão ativa e evitar o timeout.
Jefrey Sobreira Santos
Re: Onde está o erro?
09 de February de 2011 às 01:50PM
Você pode dar um exemplo?
Marcos Regis
Re: Onde está o erro?
09 de February de 2011 às 01:58PM
while (!connection_aborted()) {
$text = file_get_contents("texto.txt");
$ultima = file_get_contents("ultima.txt");
// ve se o texto atual já foi escrito
if (!$text==$ultima) {
// se o texto for novo, grava-o no arquivo temporario que sera consultado na proxima
$abre = fopen("ultima.txt", "w");
fwrite($abre, $text);
fclose($abre);
// mostra o texto com quebra de linha
echo $text."<br>";
}
// envia os dados do buffer pro usuario
flush();
ob_flush();

// "dorme" por 1 segundo
sleep(1);
echo "\r\n";
}

e remova as chamdas das funções ob_flush();
Jefrey Sobreira Santos
Re: Onde está o erro?
09 de February de 2011 às 10:48PM
Continua não funcionando. Bem, na verdade, funciona, mas por pouco tempo. Tem hora que funciona até a quarta atualização e outras que nem a primeira funciona.
Jefrey Sobreira Santos
Re: Onde está o erro?
09 de February de 2011 às 10:52PM
Eu postei a mesma dúvidas nos seguintes links:
http://forum.imasters.com.br/topic/423375-onde-esta-o-erro/
http://phpbrasil.com/phorum/read.php?2,176999,176999#msg-176999
http://br.answers.yahoo.com/question/index?qid=20110209051142AAkP9P0
http://scriptbrasil.com.br/forum/index.php?showtopic=158106&st=0&p=619229&#entry619229
http://forum.codigofonte.net/topic/17588-onde-esta-o-erro/
Jefrey Sobreira Santos
Re: Onde está o erro?
09 de February de 2011 às 11:01PM
Antes de perder a cabeça, eu vou desistir deste código. Mas, para isso, eu preciso de um substituto.
Por isso, se também não conseguirem descobrir onde está a bost* do erro, e souberem como fazer, será melhor, porque os meus analgésicos já estão acabando.
O código precisa verificar modificações num arquivo e mostrá-las, se houverem. Como aqueles utilizados nos chats. Mas, não posso usar refresh com HTML ou JS, porque se eu for mostrar um vídeo do youtube, por exemplo, fica complicado, né?
Jefrey Sobreira Santos
Re: Onde está o erro?
09 de February de 2011 às 11:28PM
aaeeee! funcionou!
é só trocar a abertura do arquivo por file_put_contents()!
o código ta cheio de partes comentadas, uma bagunça, por causa das tentativas e retornos ao estado anterior! kk tem q fazer uma limpeza!
valeu Andrey Knupp!
mas, só mais algumas perguntas:
1. Não tem como bloquear o comando "Parar" do cliente? Porque se ele clicar em "Parar", o script para de funcionar (pelo menos no Firefox).
2. Não tem como retirar o ícone e a palavra "carregando" do browser? tipo, engana o navegador e ele acha que ja foi carregada.
3. como eu faço para, ao inves de adicionar uma nova linha na tela do cliente, remover a anterior e substituir pela nova (sem usar refresh com html ou js)?
Você precisa estar logado no PHPBrasil.com para poder enviar mensagens para os nossos fóruns.

Faça o login aqui.