Ben makul olduğunu sanmıyorum.
Neden aslında böyle bir kural?
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
a> 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.