Ir para conteúdo
Fórum Script Brasil
  • 0

ob_start() + ob_get_contents() + ob_flush() no loop do mail()


CarlosFreire

Pergunta

Prezados:

Meu problema: durante o loop em mail(); fazer com que o navegador responda a cada envio (se sucesso ou não). Algo similar ao response.buffer=false no asp.

Juro que li (e creio que entendi) tudo que está no manual do PHP acerca das funções para controle de saída. Utilizei de todas as formas possíveis e imagináveis dentro do loop as funções ob_star(); ob_get_contents() e ob_flush() ou ob_end_flush(); e não consegui o resultado esperado. Tenho as respostas esperadas, sim, mas somente após o fim do loop.

Segue o código:

if(isset($_POST['submit'])==1){ //inicia o envio
$sql = mysql_query("select Nome, email from TesteMail order by Nome limit 3"); //usei este limite para teste, mas normalmente seria sem limite
$mailok = 0; $mailfalha  = 0;
$assunto = $_POST['assunto'];
$mensagem = str_replace("\r","<br>",$_POST['mensagem']);
//inicia o loop
while($result = mysql_fetch_assoc($sql)) { 
$mail_to = $result['Nome']."<".$result['email'].">";
$txtfalha = "<p>Erro no envio de e-mail para ".$result['Nome']." [".$result['email']."]</p>";
$txtsucesso = "<p>E-mail enviado com sucesso para ".$result['Nome']." [".$result['email']."]</p>”;
$nome_from = 'end do meu domínio';
$header  = 'MIME-Version: 1.0' . "\r\n";
$header .= "Content-type: text/html; charset=utf-8\n"; 
$header .= '1\r\nX-MSMail-Priority: High' . "\r\n";
$header .= "From: ".$nome_from."\r\n";
$header .= "Reply-to: end do meu domínio\r\n";
ob_start();
if (mail($mail_to, $assunto, $mensagem, $header)){$mailok= $mailok+1; $var=$txtsucesso; }else{$mailfalha= $mailfalha+1; $var=$txtfalha;}
echo $var; 
ob_get_contents();
$content = ob_get_contents();//utilizei o $content para gravar no bd e verificar posteriormente o valor obtido pelo ob_get_contents()
$sql1 = mysql_query("INSERT INTO InfoMail (titulo, texto, content) VALUES ('$assunto','$var','$content')") or die($erro[1]);
ob_end_flush(); //também tentei com o ob_flush()... dá igual.
} //acaba o loop
echo "<p>".$mailok." enviados | ".$mailfalha." não enviados.</p>";
} //fim do if submit

Em tempo: li tb. em um blog <http://resolvafacil.blogspot.com/2009/06/o-php-flush-não-descarrega-as.html>:

A causa mais comum de problemas com o uso do comando flush() em PHP está no parâmetro output_buffering do seu arquivo php.ini. Ele faz com que sejam retidos os caracteres até que o buffer seja preenchido.

Para resolver este problema, simplesmente adicione um comando str_repeat ao seu script, colocando como parâmetros um espaço que se repetirá x vezes, onde x é o valor que está contido na variável output_buffering. Você pode descobrir este valor através da função phpinfo.

O valor do output_buffering em meu php.ini estava iconfigurado como "no value" (não habilitado).

Pedi ao suporte do meu site que o habilitasse. Fizeram configurando-o como valor "1"(?), mas ressalvando que o limite seria = ao memory_limit do php.ini (no caso, 128M).

Ao ver isto, nem tentei o gatilho acima da str_replace por:

1) Citar flush(); e não ob_flush();

2) Não ter idéia de qual valor deveria colocar como x;

3) Ser um gatilho…:o(

Alguma luz?

Editado por CarlosFreire
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...