neden ob_start () PHP çalışmak için) (öncesinde session_start içinde gelmelidir?

5 Cevap php

Ben makul olduğunu sanmıyorum.

Neden aslında böyle bir kural?

5 Cevap

In "normal case," Ben ob_start önce çağrılacak olan session_start - sanmıyorum ne de etrafında başka bir yol.

Olsa da, manual page of session_start alıntı:

session_start() will register internal output handler for URL rewriting when trans-sid is enabled. If a user uses ob_gzhandler or like with ob_start(), the order of output handler is important for proper output. For example, user must register ob_gzhandler before session start.

Ama bu özel bir durum çeşit: şey çıkış işleyicileri sırası önemli olduğunu, burada: Eğer diğer yaptı şeyleri değiştirmek için bir işleyici istiyorsanız, onlar "doğru" amacıyla yürütülmesi gerekir.


Generally, if you don't use that kind of handlers (Apache and
mod_deflate do a great job when it comes to compressing output, for instance), the only thing that matters is that headers must not be sent before you call session_start (because, depending on your configuration, session_start sends cookies, which are passed as HTTP headers).

Ve başlıkları en kısa sürede veri herhangi bir parçası gönderilmelidir olarak gönderilir - yani, en kısa sürede herhangi bir çıkış olduğu gibi, <?php ?> etiketleri dışında bile bir boşluk:

Note: If you are using cookie-based sessions, you must call session_start() before anything is outputted to the browser.

ob_start PHP veri tampon sahip olduğunu gösterir:

This function will turn output buffering on. While output buffering is active no output is sent from the script (other than headers), instead the output is stored in an internal buffer.

Aslında, kendinizi, "send the data" demeden önce bu şekilde, çıkış gönderilmez. ob_start kullanılmış olmasaydı session_start, çıkış olmuştur gerektiğini bile, daha sonra denebilecek anlamına gelir - Bu başlıkları anında göndermek anlamına geliyor.


Hope this makes things a bit more clear...

Varsayılan için output_buffering Off ve geri istemciye tek bir veri byte göndermek talihsiz olmuştur, o zaman HTTP başlıklar zaten gönderildi . Hangi etkili session_start() geri istemciye çerez başlığını geçmesini engeller. Arayarak ob_start() belleğe alma etkinleştirmek ve bu nedenle http başlıkları gönderme gecikme.

Ben hem önce hem sonra denedim, ve onlar her iki çalışma. PHP 5.2.9 kullanıyorum. Hiçbir hata, hiçbir uyarı, hiçbir şey hata günlüklerini geldi.

<?php

ob_start();
session_start();

echo 'Test';

?>

Diğer bir:

<?php

session_start();
ob_start();

echo 'Test';

?>

Bu nedenle ben böyle bir kural tanımlandığı sonucuna varılmıştır.

session_start belirli yapılandırma seçenekleri ayarlanırsa HTTP başlığı değiştirmek isteyebilirsiniz. Örneğin, bir session.use_cookies that requires to set/modify the Set-Cookie başlık alandır.

HTTP başlığını değiştirme HTTP header ilk çıkış gönderilmeden hemen önce gönderilir gibi zaten müşteriye gönderilen herhangi bir çıkış olmadığını gerektirir.

Yani hiçbir çıktı session_start çağrısı önce kesinlikle orada olmasını sağlamak ya. HTTP başlık zaten çıkışı olmasa bile modifiye edilebilir ve böylece veya çıkış tampon output buffering control kullanın.

session_start() trans-sid etkin olduğunda yeniden URL için dahili çıktı işleyicisi kaydedecektir. Bir kullanıcı kullandığı ob_gzhandler veya ob_start() olduğu gibi, çıktı eylemcilerin sırası uygun çıkış için önemli ise.

Örneğin, kullanıcı ob_gzhandler oturumu başlamadan önce kaydetmeniz gerekir.

Ama bu özel bir durum çeşit. Şey çıkış işleyicileri sırası önemli olduğunu, burada, olduğunu. Eğer diğer yaptı şeyleri değiştirmek için bir işleyici istiyorsanız, bunlar "doğru" amacıyla yürütülmesi gerekir.

(Bu örneğin sıkıştırarak çıktı, geldiğinde Apache ve mod_deflate büyük bir iş yapmak) işleyicileri bu tür kullanmak istemiyorsanız, genellikle, önemli olan tek şey başlıklar önce gönderilmesi etmemelidir (yapılandırmaya bağlı olarak, session_start HTTP başlıklarını olarak geçirilir çerezleri gönderir, çünkü) session_start diyoruz.

Ve başlıkları en kısa sürede veri herhangi bir parçası gönderilmelidir olarak gönderilir - yani, en kısa sürede herhangi bir çıkış olduğu gibi, <?php ?> etiketleri dışında bile bir boşluk:

Eğer çerez tabanlı oturumlar kullanıyorsanız şey tarayıcıya outputted önce Note:, sen session_start() çağırmanız gerekir.

ob_start PHP veri tampon sahip olduğunu gösterir:

Bu işlev çıktı tamponlamasını dönecek. Çıktı tamponlama çıkış yok (başlıklar dışında) komut gönderilir aktif iken, yerine çıktı dahili bir tamponda saklanır.

Aslında "veri göndermek", kendinizi demeden önce bu şekilde, çıkış gönderilmez. Session_start sonra denebilecek anlamına gelir, çıkış olmuştur gerektiğini bile, ob_start kullanılmış olmasaydı - Bu başlıkları anında göndermek anlamına geliyor.