Çıktı tamponu

5 Cevap php

Ben bir php komut dosyası yazıyorum ve bir yerde benim header() işlevi önce ben vesile header() function bana iyi bilinen bir hata vermek neden tarayıcıya metni basılmış adres:

Uyarı: başlık bilgileri değiştirilemiyor - başlıklar zaten gönderildi.

Şimdi benim soru header() işlevi önce ve sonra ob_start() ve ob_flush() kullanarak niyetleri vardır. Ama ben bir kere çıktı tamponunda şey gibi olumsuz kişinin uygulamasının performansını etkileyebilir duydum. Nasıl doğru mu?

Veya sadece bir sayfaya yönlendirmek için JavaScript fonksiyonunu baskı fikri ile sopa gerekir.

Zaman ayırdığınız için teşekkürler.

5 Cevap

Bir çıkış tampon kullanarak RAM içinde PHP tüm çıkışını saklamak için sunucu gerektirir, bu yüzden büyük bir sayfa ise, bellek adil bir miktarda kullanarak gireriz - ve sunucu da tüm sayfa kadar beklemek zorunda kalacak küçük bir gecikmeye neden olabilir ki, onu göndermeden önce oluşturulur. Ama bunun dışında, ben bir dezavantaj pek bir çıkış tamponu kullanan var sanmıyorum. Eğer yapmak istediğiniz şey için, kesinlikle makul bir çözüm.

Biz küçük verimliliği hakkında unutmak gerektiğini, zaman yaklaşık% 97 söylüyor: Prematüre optimizasyonu tüm kötülüklerin köküdür.

Deneme ob_start ve performans farkı önemli olmadığını görmek için arkadaşlar. Öyle ise, alternatifler aramaya.

Kolay seçenek yazdırmadan önce header() çağrıyı taşımaktır.

Büyük olasılıkla gibi bir şey ile bir yönlendirme yapıyorsanız gibi:

header('Location: /new/location/');

Istemci yine baskılı veri ile bir şey olmaz çünkü (HTTP yaklaşık Kaçırdığım bir şey var sürece) bu header() çağrısından önce bir şey baskı olmamalıdır.

(Javascript yönlendirmeleri için iyi bir seçenek değildir, ve ne de nedense Javascript algılamak istediğiniz sürece meta, ferahlatıcı olduğunu.)

Relocating in PHP-code after output can say about bad application design. But I don't know your situation and can propose two possible ways.

  1. Modeli (veri işleme) ve görünüm (çıkış) böler kodu (bkz. MVC). Bu bile bir şey görüntülemeden önce taşındıktan hakkında karar verme demektir. Ben bu yolu tercih aramıştı.
  2. Eğer really çıkışı (veya gönderilen diğer başlıklar) göstermek gerekiyorsa, ortak bir yol (NoScript olarak) JS ve HTML birleştiriyor:

    if (headers_sent()) {
    	print('<script type="text/javascript">( document.location.replace ) ? document.location.replace("'.$location.'") : document.location.href = "'.$location.'";</script>'."\n".'<noscript><meta http-equiv="Refresh" content="0;URL='.$location.'" /></noscript>');
    } else {
    	header('Location: '.$location);
    	exit;
    }
    

P.S. Bu kod Fusebox çerçevesinin bir parçasıdır.

Performans ve çıkış tamponlama konusunda, ben okuma öneririm this article.

sadece son sözler cevaplama: Kullandığınız php sayfayı yönlendirebilirsiniz header('Location: '.$url) Açıkçası başka bir çıkıştan önce gitmeli ve exit(); tarafından takip edilmesi tavsiye edilir