Nasıl hata mesajları yeme PHP çıktı tamponlama durdurabilirim?

2 Cevap php

Peki, şimdi ben biraz daha içine kazanılmış ettik, ben bu aptal bir soru olduğunu fark ve yanlış. Ben korumak eski kod yazar bir php_init deyimi ile farklı bir dosyaya hata günlüğünü hi-girerdi çıkıyor. Çıktı tamponlama çıktı tamponlama benim hata mesajları atıyor sanki o appear yapma, açık gibi hi-kriko aynı anda meydana geldi.

Yani, Sayın Moderatör, bu silmek için çekinmeyin. Iyi niyetle cevap edenlere teşekkürler.


Aşağıdaki PHP komut verilen:

<?php 
error_log('test'); 

ob_start();

error_log('test2');

ob_end_flush();
?>

Ben aşağıdaki hata günlüğü çıktı alabilirsiniz:

[04-Feb-2010 11:30:38] test

Neden çıktı tamponlama benim hata mesajları yiyor? Nasıl durdurmak yapabilir?

Alternatif olarak, bir çıkış tampon dışarı mesajları kaçırmak için başka bir yolu yoktur, ya da sadece bir kara delik mi?

(PHP Kullanımı 5.2.4-2ubuntu5.10)

2 Cevap

Exceptions penetrate ob_start() shield

PHP komut dosyası yürütme durdurmak istiyorsanız, yerine) (ob_start nüfuz edecek, bir Exception atmak, ob_end_flush () kalkan

echo 'before output buffer';
ob_start();
throw new Exception('this will be seen');
ob_end_flush();

Consider creating a Logger class

Don't output directly sizin yöntemi ile değil, bir sınıf veya bir holder olan günlüğünü (ya da sizin durumda error yöntemi), örneğin içeriyor kullanın:

class Logger
{
    private $_messages = array();

    public function __construct()
    {
        $this->_messages['errors'] = array();
        $this->_messages['debug'] = array();
    }

    public function error($msg)
    {
        $this->_messages['errors'][] = $msg;
    }

    public function debug($msg)
    {
        $this->_messages['debug'] = $msg;
    }

    public function getErrors()
    {
        return $this->_messages['errors'];
    }

}

$logger = new Logger();

$logger->error('error1');

ob_start();

$logger->error('error2');

ob_end_flush();

print_r($logger->getErrors());

Eğer tutucu nesne güvenebilirsiniz bu şekilde, size göstermek istedim, mesaj atmak ve tüm hataları almazsınız

Ben pratikte hiç yapmamıştım, ama bu çalışması gerekir:

Sen) (error_log etrafında sarıcı oluşturmak zorunda olacağını

  1. saklar Eğer ob_get_contents kullanılarak tamponlama edilmiştir çıkışı ()
  2. ob_clean kullanarak çıkış tamponu siler ()
  3. ) hata iletisi ve ob_flush (yazar bunu es
  4. depolanmış çıkış kullanarak yankı geri yazar ()