Ob_start - Çıktı arabelleğe almayı etkinleştir. php projelerini desteklerken ob_start kullanma Tarayıcı arama php start

  • 03.11.2019

(PHP 4, PHP 5, PHP 7)

ob_start - Çıktı Arabelleğe Almayı Etkinleştirme

Açıklama

bool ob_start ([ çağrılabilir$ output_callback = BOŞ [, int $ yığın_boyutu = 0 [, int $ işaretleri = PHP_OUTPUT_HANDLER_STDFLAGS ]]])

Bu işlev, çıktı arabelleğe almayı etkinleştirir. Çıktı arabelleğe alma etkinse, komut dosyası çıktısı gönderilmez (başlıklar hariç), ancak dahili bir arabellekte saklanır.

Bu dahili ara belleğin içeriği, kullanılarak bir dize değişkenine kopyalanabilir. ob_get_contents()... Dahili arabelleğin içeriğini görüntülemek için şunu kullanın: ob_end_flush()... Alternatif olarak kullanabilirsiniz ob_end_clean () arabelleğin içeriğini yok etmek için.

Dikkat

Bazı web sunucuları (örneğin Apache), geri arama işlevi çağrıldığında betiğin çalışma dizinini değiştirir. kullanarak geri getirebilirsiniz. chdir (dirname ($ _ SERVER ["SCRIPT_FILENAME"])) geri arama işlevinde.

Çıkış arabellekleri yığına gönderilir, yani çağrıya izin verilir ob_start () başka bir aktif aradıktan sonra ob_start ()... Bu durumda aramak gerekir ob_end_flush() uygun sayıda kez. Birden fazla geri arama etkinse, çıktı, yuvalama sırasına göre her biri için sırayla filtrelenir.

Parametre Listesi

İsteğe bağlı output_callback parametresini ayarlayabilirsiniz. Bu işlev, argüman olarak bir dize alır ve aynı zamanda bir dize döndürmesi gerekir. Sıfırlama (gönderme) veya temizleme (ile ob_flush (), ob_clean () veya benzer işlevler) veya isteğin sonunda çıktı arabelleği tarayıcıya boşaltılırsa. output_callback işlevi çağrıldığında, arabelleğin içeriğini alır ve tarayıcıya gönderilecek çıkış arabelleği için güncellenmiş içeriği döndürmelidir. output_callback geçerli bir işlev değilse, belgelenen işlev geri dönecektir YANLIŞ... Bu parametre için fonksiyon açıklaması:

Sicim işleyici (dize $ arabellek [, int $ aşaması ])

Tampon Çıkış arabelleğinin içeriği. faz Sabit bit maskesi PHP_OUTPUT_HANDLER_ *.

output_callback dönerse YANLIŞ daha sonra orijinal bilgiler tarayıcıya değişmeden gönderilecektir.

output_callback parametresi, bir değer iletilerek yoksayılabilir BOŞ.

ob_end_clean (), ob_end_flush(), ob_clean (), ob_flush () ve ob_start () davranışları tahmin edilemez olduğundan geri arama işlevlerinden çağrılamaz. Arabelleğin içeriğini silmek istiyorsanız, geri arama işlevinden "" (boş dize) döndürün. Ayrıca işlevleri çağıramazsınız. print_r ($ ifadesi, doğru) veya Highlight_file ($ dosya adı, doğru)çıktı arabelleğe alma geri arama işlevlerinden.

Yorum Yap:

PHP 4.0.4'te işlev ob_gzhandler () sıkıştırılmış web sayfalarını destekleyen web tarayıcılarına gz kodlu veri göndermeyi kolaylaştırmak için tanıtıldı. ob_gzhandler () tarayıcı tarafından kabul edilen içerik kodlamasının türünü belirler ve buna göre çıktıyı döndürür.

Parça boyutu

İsteğe bağlı parça_boyutu parametresi iletilirse, yığın_boyutu boyutuna eşit veya daha büyük herhangi bir çıktıdan sonra arabellek temizlenir. Varsayılan değer 0 arabellek kapatıldığında çıkış işlevinin çağrılacağı anlamına gelir.

PHP 5.4.0'dan önce değer 1 parametreyi ayarlayan özel değerdi Parça boyutu 4096'da.

Flags parametresi, çıktı arabelleğinde gerçekleştirilebilecek işlemleri kontrol eden bir bit maskesidir. Varsayılan olarak, çıktı arabelleğinin temizlenmesine, temizlenmesine ve silinmesine izin verir; bu, | | , veya PHP_OUTPUT_HANDLER_STDFLAGS Bu kombinasyonun kısaltması olarak.

Her bayrak, aşağıda açıklandığı gibi bir dizi işleve erişimi kontrol eder:

Devamlı Fonksiyonlar
PHP_OUTPUT_HANDLER_CLEANABLE ob_clean (), ob_end_clean (), ve ob_get_clean ().
PHP_OUTPUT_HANDLER_FLUSHABLE ob_end_flush(), ob_flush (), ve ob_get_flush().
PHP_OUTPUT_HANDLER_REMOVABLE ob_end_clean (), ob_end_flush(), ve ob_get_flush().

Dönüş Değerleri

İadeler NS başarılı bir şekilde tamamlandığında veya YANLIŞ bir hata durumunda.

Değişikliklerin listesi

Sürüm Açıklama
7.0.0 Eğer ob_start ()çıktı arabelleğinin geri çağırma işlevi içinde kullanıldığında, bu işlev artık bir hataya neden olmaz E_ERROR ve bunun yerine arayacak E_RECOVERABLE_ERRORüçüncü taraf hata işleyicilerin onu yakalamasına izin vererek.
5.4.0 Üçüncü parametre ob_start () boole'den değiştirildi ( boole) silme parametresinin (ki, olarak ayarlandığında YANLIŞ komut dosyası çıkana kadar arabelleğin silinmesini engelledi) bir tamsayıya ( tam sayı) bayraklar parametresi. Ne yazık ki bu, PHP 5.4.0'dan önce üçüncü parametreyi kullanan kod için bir API uyumsuzluğunun ortaya çıktığı anlamına gelir. Her iki sürümle de uyumluluğu korumak için kodla nasıl çalışılacağını anlamak için bayraklar örneğine bakın.
5.4.0 Parametre Parça boyutu yerleştirmek 1 , şimdi çıktı arabelleğine 1 bayt verir.
4.3.2 İşlev geri dönecek YANLIŞ output_callback başarısız olması durumunda.

Örnekleri

Örnek # 1 Kullanıcı tanımlı bir geri arama işlevi örneği

İşlev geri çağırma ($ arabellek)
{
// tüm elmaları portakallarla değiştir
dönüş (str_replace ("elmalar", "portakallar", $ arabellek));
}

Ob_start ("geri arama");

?>


Elma ile armudu kıyaslamak gibi.






ob_end_flush();

Merhaba Habr!

Bugün, acemi web yöneticilerini php'de çıktı arabelleğe almayı kullanmanın çeşitli şık yolları ile tanıştırmak istiyorum. Deneyimli web yöneticileri burada kendileri için yararlı bir şey bulamazlar. Her ne kadar - kim bilir?

Hepinizin bildiği gibi, php'nin çıktı tamponlaması "ob_" ile başlayan bir dizi fonksiyon tarafından kontrol edilir. Bunlardan en önemlisi ob_start'tır. Başlatıldığında, daha sonra ziyaretçiye bir html sayfası şeklinde verilecek olan sonraki çıktıyı, yani her türlü print(), echo ve benzerini toplar. Ve çıktı almadan önce arabelleğe almaya başladıysak, bu neredeyse bitmiş sayfayla nihayet bir şeyler yapabiliriz.


Örneğin, üçüncü taraf sitelere giden tüm bağlantıları filtrelemek istiyoruz.

Bir balta kadar eski australopithecus forumumuzda, çok sayıda spam gönderici sürüsü, ziyaretçileri sefahat, tek kollu haydutlar ve siyasi ajitasyonla dolu yerlere çekiyor. js'yi izleme ile kullanmak mümkün olabilir, ancak tüm bu bağlantıları şu şekilde değiştirmek istiyoruz:

"http://blackjack-hookers.com" => "http://myoldforum.ru/redirect.php?url=blackjack-hookers.com"

Yöntem en etkili olmayabilir, ancak etkili olabilir. Redirect.php'yi bir filtre ve bir kara liste ile yazdık ve şimdi binlerce forum sayfasındaki tüm bağlantıları dönüştürmemiz gerekiyor. ob_start ve birkaç normal ifade ile bunu sadece birkaç satırda yapacağız:

f_callback ($ arabellek) işlevi ($ arabellek = preg_replace ("#http:// (www.)? Myoldforum \ .ru / #", "/", $ arabellek); $ arabellek = preg_replace ("# href =" http : // ([^ "] *)" # "," # href = "/redirect\.php\?url=$1", $ tampon); return $ tampon;) ob_start (f_callback);

Şimdi bu kodu index.php'nin başına veya sunucunun sayfaları görüntülerken eriştiği başka bir dosyaya ekleyerek ihtiyacımız olanı alacağız.

İçeriği bu şekilde değiştirerek, motorun yöntemleri çerçevesinde sınırlı kalmıyoruz. Bu çok değerli olabilir. Örneğin, bir eklenti ekleyebilirsiniz:

function create_plugin () (/ * bir şey üretiyor * /) function f_callback ($ arabellek) (/*...*/ $ arabellek = str_replace ("", create_plugin (), $ arabellek); /*...*/ dönüş $ arabellek;) ob_start (" f_callback ");

Artık içeriğe eklediğimiz yerde, almak istediğimiz şey karşımıza çıkacak. Kullanımlarından biri, bir site sayfasına bir js widget'ı eklemektir. Örneğin, Yandex haritaları. Bu genellikle zor değildir, ancak bazen kötü yazılmış bir site sayfası düzenleyicisi tırnak işaretleri ve küme parantezlerinden kaçarak widget'ı bozar. Gördüğünüz gibi, bu sorun kolayca çözülebilir.

Php'nin çıktı arabelleği araçları zengindir ve yalnızca ob_start ile sınırlı değildir. Bazı durumlarda, yukarıdaki teknikler tüm sayfada çalıştıkları için gereksiz yere kaynak yoğun ve hantaldır. Ormana gitmek istemediğimiz, ancak kesinlikle düzeltmemiz gereken bir şeyin oluşturulması etrafında şablonda bir sarmalayıcı oluşturarak bunun yalnızca bir kısmını işleyebiliriz:

(BÜYÜK ÇILGIN ŞEY OLUŞTUR)

Tüm bu ifadeleri zaten fark etmiş olmalısınız: "Tırmanmak istemiyorum", "tyrannosaurus sandalyesi kadar eski", "çarpık yazılmış editör" ... İdeal bir dünyada, çıktı tamponunun etrafındaki mermilere ihtiyaç yoktur. ob_start ile yapılabilecek her şey teorik olarak onsuz da yapılabilir. Bu teknik bazen proje kodunu karıştırır, birçoğu anlamını yalnızca sıkıştırma için ob_gzhandler'a göndermekte görür ve diğer durumlarda kullanımını tehlikeli olarak görür. Ancak çoğu zaman çıktıyı yönetmeden yapamazsınız.

Özellikle derine inmek istemiyorsanız.

substr () işlevi, bir dizenin bir bölümünü döndürür.

Not: Başlangıç ​​parametresi negatif bir sayıysa ve uzunluk başlangıca eşit veya küçükse uzunluk 0 olur.

Sözdizimi

alt dizi ( dize, başlangıç, uzunluk)


Parametre Açıklama
sicim Gerekli. Bir parçası döndürülecek dizeyi belirtir
Başlat Gerekli. dizede nereden başlayacağını belirtir
  • Pozitif bir sayı - Dizede belirtilen bir konumdan başlayın
  • Negatif bir sayı - Dizenin sonundan belirli bir konumdan başlayın
  • 0 - Dizedeki ilk karakterden başlayın
uzunluk İsteğe bağlı. Döndürülen dizenin uzunluğunu belirtir. Varsayılan, dizenin sonuna kadardır.
  • Pozitif bir sayı - Başlangıç ​​parametresinden döndürülecek uzunluk
  • Negatif sayı - Dizenin sonundan döndürülecek uzunluk

Teknik detaylar

Geri dönüş değeri: Bir dizenin ayıklanan kısmını veya hata durumunda FALSE veya boş bir dize döndürür
PHP Sürümü: 4+
Değişiklik günlüğü: PHP Sürüm 5.2.2 ila 5.2.6'da, start parametresi negatif bir kesmenin veya ötesinin konumunu gösteriyorsa, FALSE döndürülür. Diğer sürümler dizeyi baştan alır

Daha fazla örnek

örnek 1

Başlangıç ​​parametresini farklı pozitif ve negatif sayılarla kullanma:

echo substr ("Merhaba dünya", 10). "
";
echo substr ("Merhaba dünya", 1). "
";
echo substr ("Merhaba dünya", 3)."
";
echo substr ("Merhaba dünya", 7). "
";

echo substr ("Merhaba dünya", - 1). "
";
echo substr ("Merhaba dünya", - 10). "
";
echo substr ("Merhaba dünya", - 8). "
";
echo substr ("Merhaba dünya", - 4). "
";

PHP, bir diziyi diğerinin içinde arayan çeşitli işlevler sağlar. Bazıları bulunan dizenin (strpos, strrpos ve ilgili) konumunu döndürür ve orijinal dizenin (strstr ve strrchr) bir kısmını döndürür. Aradığınız dize orijinalde bulunmazsa, arama işlevleri false döndürür.

Amacınız basitçe bir dizgenin diğerinde var olup olmadığını belirlemekse, en verimli seçenek strpos'tur.

strpos

strpos işlevi, ilk dize bağımsız değişkenini ikincisini arar ve dize içindeki ilk eşleşmenin sıfır tabanlı dizin konumunu veya bulunamazsa false döndürür. Aşağıdaki örnek şunu göstermektedir:

$ dizi =; // $ str içinde "ihtiyacın" ilk oluşumunu arayın$ pos = strpos ($ str, "ihtiyaç"); // $ pos'un tipini ve değerini göster var_dump ($kon); // int (3)

Sonucu yukarıda var_dump kullanarak göstermiş olsak da, strpos için dönüş değerinin tipik bir incelemesi şu şekilde gerçekleştirilir:

// strpos dönüş değeri nasıl incelenir ($ pos) if ($ pos! == false) (// arama dizesi bulunursa echo "onu $ pos" konumunda buldu;) else (echo "bulunamadı.";)

strpos işlevinin "dönüş değerini false ile karşılaştırmak için === veya! == operatörlerini kullandığınızdan emin olun. Alt dize dizenin başında bulunursa, strpos 0 döndürür, bu == veya! = Operatörler yanlışa çevirirdi.

Bu örnekte gösterildiği gibi, aramayı dizenin başlangıcından belirli sayıda karakterle başlatmak için bir uzaklık belirtebilirsiniz:

/ * strpos argümanları: * konu dizgisi (aka samanlık), arama dizgisi (iğne), ofset (isteğe bağlı) * / // $ str'de 10 karakterinden "ihtiyaç" aramaya başla$ pos = strpos ($ str, "ihtiyaç", 10); // yirmi

Aramayı karakter 10'dan başlattığınızda, sonuç, iğne kelimesinin başlangıcının dizin konumu olan 20'dir.

strrpos

strrpos işlevi, bir dizede bir alt dizenin son oluşumunun konumunu bulur:

// aramalar için kullanılacak örnek dize$ dizi = "Samanlıkta iğneyi bulmalıyız."; // $ str içindeki "ihtiyacın" son oluşumunun yerini bul$ pos = strrpos ($ str, "ihtiyaç"); // yirmi

strrpos işlevi ayrıca, pozitif veya negatif olabilen isteğe bağlı bir ofset parametresi sağlar. Ofset pozitifse, dizenin başlangıcındaki bu sayıda karakter arama dışında bırakılır. Aşağıdaki örneği göz önünde bulundurun:

// ilk 3 karakter hariç sağdan "Biz" için arama yapın$ pos = strrpos ($ str, "Biz", 3); var_dump ($kon); // bool (yanlış)

Arama ilk üç karakteri hariç tuttuğunda "Biz" bulunamadığından sonuç yanlıştır.

Ofset negatifse, dizenin sonundaki o kadar çok karakter aramadan çıkarılır. Negatif bir ofset belirten iki arama ile gösteriyoruz:

// son 5 karakter hariç sağdan "hay" için arama yapın$ pos = strrpos ($ str, "saman", - 5); // int (34) // son 10 karakter hariç sağdan ara$ pos = strrpos ($ str, "saman", - 10); // bool (yanlış)

Arama son 10 karakteri hariç tuttuğunda "hay" bulunamadığından yukarıdaki son sonuç yanlıştır.

Arama sağdan başlasa bile, strrpos işlevinin dönüş değerinin dizenin başlangıcından itibaren konumu verdiğine dikkat edin.

stripolar ve stripolar

strpos ve strrpos işlevleri, büyük/küçük harfe duyarlı aramalar gerçekleştirir. PHP, büyük/küçük harfe duyarsız aramalar gerçekleştirmek için stripos ve strripos işlevleri sağlar. Tıpkı büyük/küçük harfe duyarlı eşdeğerleri gibi çalışırlar:

// aramalar için kullanılacak örnek dize$ dizi = "Samanlıkta iğneyi bulmalıyız."; // "biz" için büyük/küçük harfe duyarsız arama yap$ konum = şeritler ($ dize, "biz"); // int (0) // "İhtiyaç" için sağdan büyük/küçük harfe duyarsız arama yap$ pos = strripos ($ str, "İhtiyaç"); // int (20)

"Biz" için büyük/küçük harfe duyarsız arama, 0 ile sonuçlanır ve bu, arama yaptığımız dizenin başında bulunduğunu gösterir. Sağdan "İhtiyaç" için büyük/küçük harfe duyarsız arama (strripos kullanarak), onu 20 konumunda bulur.

strstr

strstr işlevi, ikinci için ilk dize bağımsız değişkenini arar. İkincisi ilkinde bulunursa, strstr, orijinal dizenin ilk bulunan oluşumdan başlayarak dizenin sonuna kadar olan kısmını döndürür.

// örnek dizge $ dizge = "Samanlıkta iğneyi bulmalıyız."; // $ str $ yenistr = strstr ($ str, "the"); var_dump($newstr); // string (27) "samanlıktaki iğne."

strstr işlevi, orijinal dizenin geri kalanıyla birlikte bulduğu ilk "the" öğesini döndürür.

strstr'ye üçüncü argüman olarak true iletirseniz, orijinal dizenin kısmı önce bulunan dize döndürülür:

// $str'nin "the"den önceki kısmını döndürmek için true değerini iletin$ yenistr = strstr ($ str, "the", doğru); var_dump($newstr); // string (16) "Bulmalıyız"

Bu sefer strstr işlevi, dizgedeki ilk "the" den önceki her şeyi döndürür.

PHP ayrıca, büyük/küçük harfe duyarsız bir arama gerçekleştirmesi dışında, strstr ile tamamen aynı şekilde çalışan stristr işlevini de sağlar.

strrchr

strrchr işlevi, ikinci argümanda belirttiğimiz karakter için sağdan ilk dize argümanını arar. İşlev, o karakterin bulunan örneğinin konumundan dizenin sonuna kadar dizenin bölümünü döndürür:

// örnek dizge $ dizge = "Samanlıkta iğneyi bulmalıyız."; // $ str içinde sağdan "s"yi ara$ yenistr = strstr ($ str, "s"); var_dump($newstr); // string (6) "yığın."

strstr'den farklı olarak, ikinci argüman birden çok karakterden oluşuyorsa, yalnızca ilkinin kullanıldığına dikkat edin:

// çok karakterli ikinci argümanla test et$ yenistr = strrchr ($ str, "the"); var_dump($newstr); // string (5) "tack."

"haystack" döndürmek yerine, strrchr işlevi aramaya ikinci bağımsız değişkenin yalnızca ilk harfini uygulayarak "tack" döndürür.