Neden PHP çıktı tamponlama kullanıyorsanız?

11 Cevap php

Farklı yazarlar çıktı tamponlama kullanarak öneririm internette malzeme biraz okudum. Komik şey gerçek içeriği ile yanıt başlıklarını karıştırmak için izin vermesi nedeniyle kullanımı için çoğu yazarlar bir argümandır. Açıkçası, ben sorumlu web uygulamaları should not mix çıkış başlıkları ve içerik ve web geliştiricileri çıkış oluşturulduktan sonra gönderilen başlıklarında neden kendi komut mümkün mantıksal kusurları için bakmak gerektiğini düşünüyorum. Bu ob_* çıktı tamponlama API karşı benim ilk argümandır. Hatta bu küçük kolaylık olsun - çıkışı ile başlıkları karıştırma - bir genellikle ciddi bir web uygulamasında amaç ne yol değildir ki, hızlı komut kadar kesmek gerekiyor sürece, onu kullanmak için yeterli bir neden değildir.

Ayrıca, çıktı tamponlama API ile uğraşan insanların çoğu açık çıktı tamponlama zaten, still does some internal buffering takılı web sunucusu ile birlikte, PHP etkinleştirilmiş bile olmadan gerçeği hakkında sanmıyorum düşünüyorum. Bu kontrol etmek kolaydır - 10 saniye söylemek için bazı kısa dize bir yankı, uyku yapmak ve başka bir yankı yapmak. Bir tarayıcı ile komut isteyin ve iki satır sonra görünen ile, 10 saniye boyunca boş sayfa duraklama izleyebilirsiniz. Bazıları istemci ve sunucu arasındaki gerçek trafiğini izlemek, bir rendering parazit değil, trafik söylüyorlar önce sunucu tüm çıkış için uygun bir değer ile Content-Length başlık üretti gösterir - düşündüren bu Çıktı, her echo çağrısı ile kademeli gönderilir, ancak bazı tampon biriken ve sonra komut sona ermesi üzerine gönderilmedi. Neden biz birbiri üstüne iki farklı çıkış tampon uygulamaları gerek yoktur - bu açık çıktı tamponlama ile benim sancı biridir? Dahili (erişilemez) PHP / Web sunucusu çıktı tamponlama bir PHP geliştiricisi kontrol edemez koşullara tabidir, ve gerçekten kullanışlı değil, bu nedenle bunun nedeni bu olabilir mi?

Her durumda, biri için ben, bir açık çıktı tamponlama (ob_* fonksiyonların serisi) önlemek ve örtük birine güvenmek, iyi flush fonksiyonu ile yardım gerektiğini düşünmeye başlar , gerektiğinde. Aslında her echo / baskı çağrısı ile istemciye çıktı göndermek için web sunucusu bazı garanti yoktu belki, o zaman açık tamponlama kurmak yararlı olacaktır - her biri bir 100 ile istemciye yanıt göndermek istemiyor sonra bayt topakları. Ancak iki tamponlar ile alternatif bir soyutlama biraz gereksiz bir tabaka gibi görünüyor.

Yani, sonuçta, ciddi web uygulamaları çıktı tamponlama gerekiyor?

11 Cevap

Ok, here is the real reason : the output is not started until everything is done. Imagine an app which open an SQL connection and don't close it before starting the output. What happen is your script get a connection, start outputting, wait for the client to get all it needs then, at the end, close the connection. Woot, a 2s connection where a 0.3s one would be enough.

Şimdi, tampon varsa, script sonunda otomatik olarak kesmek, bir tampon her şeyi koymak, bağlamak, daha sonra müşteri için oluşturulan içerik göndermeye başlayabilirsiniz.

i bir nedenle çıktı tamponlama kullanıyorsanız ... ben isteği işleme başladık sonra bana bir "konum" başlığını göndermenizi sağlar.

Eğer ekrana çıktı bir rapor istiyorum ama aynı zamanda e-posta yoluyla göndermek, çıktı tamponlama iki kez çıktı rapor için işleme tekrarlamak zorunda değildir sağlar.

En belirgin kullanım durumları şunlardır:

  1. Bir çıkış filtresi (örneğin ob_gzhandler ya da kendi üzerinde geliştirebilir filtre herhangi bir sayı); I have done this with APIs that only support output (rather than return values) where I wanted to do subsequent parsing with a library like phpQuery.
  2. Eğer tartışmak tüm sorunları ile yazılmış kod (yerine yeniden daha) Bakım; Bu çıkış (kredi Don Dickinson) veya hali hazırda üretilmiş olup, belirli çıktı bastırılmasını başladıktan sonra başlıkları gönderme gibi şeyler içerir.
  3. Sendeleyerek çıktı (Tom ve Langdon burada kredi); Lütfen testler PHP / Apache 'nin varsayılan iç tamponu ile çakıştığından başarısız oldu, ama yapmak o is mümkün olabileceğini unutmayın, sadece bir şey-PHP halen tutacak göndereceğiz PHP önce yıkanmalıdır belirli bir miktar gerektirir bağlantısı olsa açın.

Çıkış tamponlama kendi dahili tamponlama yapar IIS üzerinde önemlidir. Çıktı tamponlama kapalıyken, PHP betikleri onlar Apache yapmak çok daha yavaş çalışmasına görünür. Bunu açmak ve birçok kat daha hızlı koşmak.

Bu eski bir soru ama kimse outbut tamponlama önemli bir özelliği filtering olduğunu söyledi. Bu istemciye göndermeden önce tampon önişlem mümkündür.

Bu çok güçlü bir kavram ve birçok ilginç olanaklar açar. Bir projede ben aynı anda iki filters kullandı:

  1. terimler ad-hoc çeviri (kısa metinlerin değiştirilmesi)
  2. HTML, CSS ve Javascript şaşırtmaca (bana sormayın neden)

Çıkış filtreleme aramayı etkinleştirmek için ob_start("callback") burada callback süzme işlevinin adıdır. Daha fazla bilgi için PHP'nin kılavuzuna bakın ob_start: http://php.net/manual/en/function.ob-start.php

Yes

Ciddi web uygulamaları belirli bir durum çıktı tamponlama gerekir:

Your application wants control over what is output by some 3rd-party code, but there is no API to control what that code emits.

In that scenario, you can call ob_start() just before handing control to that code, mess around with what is written (ideally with the callback, or by examining the buffer contents if you must), and then calling ob_flush().

Sonuçta, phps 'ob_ functions yakalamak için bir mekanizma ne kod bazı other bit into a buffer you altüst edebilir ile yapar.

Eğer incelemek veya tampona yazılır ne değiştirmek gerek yoksa, nothing gained ob_start() ile vardır.

Oldukça büyük olasılıkla, 'ciddi uygulama' aslında bir tür çerçevedir.


You already have output buffering, anyway

Sen make use of çıkış tamponlama için ob_start() gerekmez. Web-sunucu zaten does sizin çıkış tampon.

Kullanımı ob_start() better çıktı tamponlama seni almaz - aslında web sunucusu aksi istemciye gönderilen olurdu 'istifleme' verilerine göre uygulamanın bellek kullanımını ve gecikme artırabilir zaten.


Maybe ob_start() ...

... for convenience when flushing

Bazı durumlarda, when web sunucu uygulaması iyi bilen bazı kriterlere dayalı, kendi tamponunu boşaltır kontrole isteyebilirsiniz. Çoğu zaman, size sadece müşteri yararlanabilirler mantıksal bir 'birim' yazmayı bitirdim biliyorum, ve çıkış tampon için sabırsızlanıyorum now temizlemek için web sunucusu söylüyorum ve konum dolmaya. Bunu yapmak için, normal olarak çıkış yayarlar, ve flush() ile noktalamak için sadece gerekli.

Daha nadiren, size göndermek için yeterli veriye sahip kadar web sunucusu veri kesintisi isteyeceksiniz. Hiçbir nokta haber kalanı mevcut olmak için biraz zaman alacaktır, özellikle haber yarısı ile müşteri kesmeden. Basit bir ob_start daha sonra tarafından sonuçlandırılan bir ob_end_flush() gerçekten yapmak için basit ve uygun bir şey olabilir.

... if you have responsibility for certain headers

Uygulama tam yanıt mevcuttur sonra ancak tespit edilebilir başlıklarını hesaplamak için sorumluluk alıyorsa, o zaman may kabul edilebilir.

Eğer tam Çıktı tamponunu inceleyerek başlığını kaynaklanan daha iyi yapamaz Ancak, burada bile, siz de (o olacak) web sunucusu yapalım olabilir. Web sunucusunun kod, yazılı test edilmiş ve derlenmiş - bunu geliştirmek için olası değildir.

Örneğin, sadece uygulaması tepki vücut hesaplar önce sonra yanıt gövdesi uzunluğunu bilen varsa Content-Length başlığı ayarlamak için yararlı olacaktır.


No panacea for bad practices

Sen ob_start() disiplinlerini önlemek gerekir:

  • opening, using ve bu bellek, ipler ve veritabanı bağlantıları gibi hızlı closing kaynaklar
  • İlk başlıkları yayan ve vücut ikinci
  • yanıtını başlamadan önce, size tüm hesaplamalar ve hata denetimi yapmak

Eğer bu yoksa, size bir gün ağlatır olacak teknik borcu neden olacaktır.

Ben bazı çıktı before Ben render kullanmak oluşturmak için render işleminin sonucunu bilmek gerekir, dize sıralanmasıyla üreten HTML önlemek amacıyla çıktı tamponlama kullanıyorsanız.

Biz bir veritabanından veri ile dolu çok uzun tablolarla sayfaları için gün içinde geri kullanmak için kullanılır. Kullanıcı sayfa aslında çalışıyordu biliyordu böylece tampon her x satırları yıkayın ediyorum. Sonra birisi kullanılabilirlik duydum ve bunun gibi sayfaları çağrı ve arama var.

Eğer işlemek için biraz zaman alır bir sayfa sırasında bir ilerleme çubuğu görüntülemek için çalışıyoruz eğer yararlıdır. PHP kodu çok dişli olmadığından işlem 1 işlevi yapıyor kapattı eğer, sen bunu yapamazsın.

Eğer veritabanı işlemleri ve işleme yapıyoruz eğer diğer benzer istekleri için, bir dosyadaki verileri önbelleğe çıktı tamponlama kullanın.