Ob_start - Ota lähdön puskurointi käyttöön. Ob_start-parametrin käyttäminen tuettaessa php-projekteja

Ymmärtääkseni sivusto luodaan ilman kehystä? Ja sitten tuntemani kehittäjät surissivat korvissani, että minun piti tutkia Yii-kehystä.

2) Halusin kysyä... Esimerkki verkkokaupan luomisesta, jota käsitellään kurssilla, onko se melko akateeminen? Todelliset kaupalliset projektit luodaan todennäköisesti kehyksiä käyttäen, koska... tämä optimoi kehitysprosessin suuresti käyttämällä vakiokoodimalleja. Vastaus tähän kysymykseen auttaisi selventämään, mitä tapahtuu... PHP Start | Kannattaako vielä harjoitella yleisen logiikan ymmärtämiseksi?

Vastaus:

1) Ystävät, tämä on oikein, minäkin ajattelen niin. Mutta mikä tahansa kehys vaatii valmistautumista, esimerkiksi tietoa. Kun rakensin MVC-järjestelmää käytännössä, yritin noudattaa puitteissa käytettyjä lähestymistapoja. Siksi PHP Start (teoria ja käytäntö) auttaa valmistautumisessa, jonka jälkeen voit turvallisesti aloittaa yii2:n (tai vastaavan) oppimisen.

Projektivaraston osoite:

Kysymys 1:

En pääse eroon virheestä:

Huomautus: Määrittämättömän vakion _FILE_ käyttö - oletetaan "_FILE_" tiedostossa /Users/Elios/Sites/Test/index.php rivillä 10

Kerro minulle, mikä se voisi olla?

Vastaus:

Ennen ja jälkeen TIEDOSTO sinun täytyy kirjoittaa 2 merkkiä _

__TIEDOSTO__ kuuluu "maagisiin" PHP-vakioihin. Tarkemmat tiedot täältä.

(PHP 4, PHP 5, PHP 7)

ob_start - Ota lähtöpuskurointi käyttöön

Kuvaus

Bool ob_start ([ kutsuttavissa$output_callback = TYHJÄ [, int $palan_koko = 0 [, int $liput = PHP_OUTPUT_HANDLER_STDFLAGS ]]])

Tämä toiminto mahdollistaa lähdön puskuroinnin. Jos lähdön puskurointi on aktiivinen, skriptitulostetta ei lähetetä (paitsi otsikoita), vaan se tallennetaan sisäiseen puskuriin.

Tämän sisäisen puskurin sisältö voidaan kopioida merkkijonomuuttujaan käyttämällä ob_get_contents(). Voit tulostaa sisäisen puskurin sisällön käyttämällä ob_end_flush(). Vaihtoehtoisesti voit käyttää ob_end_clean() puskurin sisällön tuhoamiseksi.

Huomio

Jotkut verkkopalvelimet (esimerkiksi Apache) muuttavat skriptin työhakemistoa, kun takaisinsoittotoimintoa kutsutaan. Voit saada sen takaisin käyttämällä chdir(dirname($_SERVER["SCRIPT_FILENAME"])) takaisinsoittotoiminnossa.

Lähtöpuskurit työnnetään pinoon, mikä tarkoittaa, että kutsut ovat sallittuja ob_start() kun olet soittanut toiselle aktiiviselle ob_start(). Tässä tapauksessa on tarpeen soittaa ob_end_flush() sopiva määrä kertoja. Jos useita takaisinsoittotoimintoja on aktiivisia, tulos suodatetaan peräkkäin kullekin niistä sisäkkäisjärjestyksessä.

Luettelo parametreista

Valinnainen output_callback-parametri voidaan määrittää. Tämä funktio ottaa merkkijonon argumenttina ja sen on myös palautettava merkkijono. Sitä kutsutaan, kun nollaus (lähetä) tai puhdistus (käyttäen ob_flush(), ob_clean() tai vastaavat toiminnot) tai jos lähtöpuskuri tyhjennetään selaimeen pyynnön lopussa. Kun output_callback-funktiota kutsutaan, se vastaanottaa puskurin sisällön ja sen on palautettava päivitetty sisältö tulospuskurin lähettämistä varten selaimeen. Jos output_callback ei ole kelvollinen funktio, dokumentoitu funktio palaa VÄÄRÄ. Tämän parametrin toiminnon kuvaus:

merkkijono käsittelijä (merkkijono $puskuri [, int $vaihe ])

Puskuri Tulostuspuskurin sisältö. vaihe Vakioiden bitimaski PHP_OUTPUT_HANDLER_*.

Jos output_callback palauttaa VÄÄRÄ, alkuperäiset tiedot lähetetään selaimeen ilman muutoksia.

Parametri output_callback voidaan jättää huomiotta välittämällä arvo TYHJÄ.

ob_end_clean(), ob_end_flush(), ob_clean(), ob_flush() Ja ob_start() ei voida kutsua takaisinsoittofunktioista, koska niiden käyttäytyminen on arvaamatonta. Jos haluat poistaa puskurin sisällön, palauta "" (tyhjä merkkijono) takaisinsoittotoiminnosta. Et myöskään voi kutsua toimintoja print_r($lauseke, tosi) tai highlight_file($tiedostonimi, tosi) lähtöpuskuroinnin takaisinsoittotoiminnoista.

Kommentti:

PHP 4.0.4:ssä funktio ob_gzhandler() otettiin käyttöön helpottamaan gz-koodattujen tietojen lähettämistä web-selaimiin, jotka tukevat pakattuja verkkosivuja. ob_gzhandler() määrittää selaimen hyväksymän sisällön koodaustyypin ja palauttaa tulosteen sen mukaisesti.

chunk_size

Jos valinnainen chunk_size-parametri välitetään, puskuri tyhjennetään jokaisen lähdön jälkeen, jonka koko on suurempi tai yhtä suuri kuin chunk_size. Oletusarvo 0 tarkoittaa, että lähtötoimintoa kutsutaan, kun puskuri suljetaan.

Ennen PHP 5.4.0:a, arvo 1 oli erikoisarvo, joka asetti parametrin chunk_size numerolla 4096.

Liput-parametri on bittimaski, joka ohjaa toimintoja, jotka voidaan suorittaa tulospuskurille. Oletusarvoisesti se sallii lähtöpuskurin tyhjentämisen, tyhjentämisen ja poistamisen, mikä on sama kuin | | , tai PHP_OUTPUT_HANDLER_STDFLAGS lyhenteenä tästä yhdistelmästä.

Jokainen lippu ohjaa pääsyä toimintosarjaan alla kuvatulla tavalla:

Jatkuva Toiminnot
PHP_OUTPUT_HANDLER_CLEANABLE ob_clean(), ob_end_clean(), Ja ob_get_clean().
PHP_OUTPUT_HANDLER_FLUSHABLE ob_end_flush(), ob_flush(), Ja ob_get_flush().
PHP_OUTPUT_HANDLER_REMOVABLE ob_end_clean(), ob_end_flush(), Ja ob_get_flush().

Palautusarvot

Palauttaa TOTTA onnistuneen suorittamisen jälkeen tai VÄÄRÄ jos tapahtuu virhe.

Luettelo muutoksista

Versio Kuvaus
7.0.0 Jos ob_start() käytetään lähtöpuskurin takaisinkutsutoiminnon sisällä, tämä toiminto ei enää tuota virhettä E_ERROR, mutta soittaa sen sijaan E_RECOVERABLE_ERROR, jolloin kolmannen osapuolen virhekäsittelijät voivat saada sen kiinni.
5.4.0 Kolmas parametri ob_start() muutettu boolen arvosta ( boolean) poistoparametrista (joka, kun se on asetettu arvoon VÄÄRÄ esti puskurin poistamisen ennen kuin komentosarja on valmis) kokonaisluvuksi ( kokonaisluku) merkitsee parametria. Valitettavasti tämä tarkoittaa API-yhteensopimattomuutta koodille, joka käytti kolmatta parametria ennen PHP 5.4.0:aa. Katso lippuesimerkki ymmärtääksesi, kuinka koodia käytetään niin, että se on yhteensopiva molempien versioiden kanssa.
5.4.0 Parametri chunk_size, asennettu sisään 1 , johtaa nyt siihen, että 1 tavu tulostetaan lähtöpuskuriin.
4.3.2 Toiminto palaa VÄÄRÄ siinä tapauksessa, että output_callback ei voida suorittaa.

Esimerkkejä

Esimerkki #1 Esimerkki käyttäjän määrittämästä takaisinsoittofunktiosta

Toiminnon takaisinsoitto ($puskuri)
{
// korvaa kaikki omenat appelsiineilla
return (str_replace("omenat", "appelsiinit", $puskuri));
}

Ob_start("takaisinsoitto");

?>


Se on kuin vertaisi omenoita ja appelsiineja.




ob_end_flush();

Hei, Habr!

Tänään haluan esitellä aloitteleville webmastereille lukuisia siistejä tapoja käyttää tulostuspuskurointia PHP:ssä. Kokeneet verkkovastaavat eivät todennäköisesti löydä täältä mitään hyödyllistä. Vaikka - kuka tietää?

Kuten kaikki tiedätte, php:n lähdön puskurointia ohjaa joukko funktioita, jotka alkavat kirjaimella "ob_". Tärkein niistä on ob_start. Kun se käynnistetään, se kerää myöhemmän tulosteen, toisin sanoen kaikenlaisia ​​print(), echoja jne., jotka sitten annetaan vierailijalle html-sivun muodossa. Ja jos aloitimme puskuroinnin ennen tulostamista, voimme vihdoin tehdä jotain tälle melkein valmiille sivulle.


Haluamme esimerkiksi suodattaa pois kaikki linkit ulkopuolisille sivustoille.

Foorumillamme, joka on yhtä vanha kuin Australopithecuksen kirves, parveilee paljon roskapostittajia, jotka houkuttelevat vierailijoita paikkoihin, jotka ovat täynnä irstailua, yksikätisiä rosvoja ja poliittista kiihotusta. Voisimme käyttää js:ää seurannassa, mutta haluamme muuttaa kaikkia näitä linkkejä seuraavasti:

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

Menetelmä ei ehkä ole tehokkain, mutta se on tehokas. Kirjoitimme redirect.php:n suodattimella ja mustalla listalla, ja nyt meidän on muutettava kaikki linkit tuhansilla foorumisivuilla. Käyttämällä ob_start ja muutama säännöllinen lauseke, voimme tehdä tämän vain muutamalla rivillä:

Funktio f_callback($puskuri)( $puskuri = preg_replace("#http://(www.)?myoldforum\.ru/#","/",$puskuri); $puskuri = preg_replace("#href="http ://([^"]*)"#","#href="/redirect\.php\?url=$1",$puskuri) ob_start(f_callback);

Lisäämällä tämän koodin index.php:n tai muun tiedoston, jota palvelin käyttää sivuja katsellessaan, alkuun, saamme tarvitsemamme.

Muuttamalla sisältöä tällä tavalla, moottorin menetelmät eivät rajoita meitä. Tämä voi olla erittäin arvokasta. Voit esimerkiksi lisätä laajennuksen:

Funktio generate_plugin() ( /*luo jotain*/ ) funktio f_callback($puskuri)( /*...*/ $puskuri = str_replace ("",generate_plugin(),$puskuri); /*...*/ return $puskuri; ) ob_start("f_callback");

Nyt kun lisäsimme sisältöä, se mitä halusimme, tulee näkyviin. Yksi sovelluksista lisää js-widgetin verkkosivuston sivulle. Esimerkiksi Yandex-kartat. Yleensä tämä ei ole vaikeaa, mutta joskus huonosti kirjoitettu verkkosivuston sivueditori välttelee lainauksia ja kiharoita ja rikkoo widgetin. Kuten näet, tämä ongelma on helppo ratkaista.

Tulostuspuskurin kanssa työskentelyyn tarkoitettujen PHP-työkalujen joukko on runsas, eikä se rajoitu vain ob_start-ohjelmaan. Yllä kuvatut menetelmät ovat joissakin tapauksissa liian resurssiintensiivisiä ja hankalia, koska ne toimivat koko sivulla. Voimme käsitellä vain osan siitä luomalla malliin kääreen sellaisen tuotteen sukupolven ympärille, johon emme halua päästä, mutta joka on ehdottomasti korjattava:

(LUO SUURI HULLUA)

Olet varmaan jo huomannut kaikki nämä lauseet: "En halua mennä siihen", "vanha kuin tyrannosaurus-tuoli", "väärin kirjoitettu editori"... Ihanteellisessa maailmassa lähtöpuskurin ympärillä olevat kuoret ovat ei tarvita. Kaikki mikä voidaan tehdä ob_startilla, voitaisiin teoriassa tehdä ilman sitä. Tämä tekniikka aiheuttaa toisinaan sekaannusta projektin koodiin, monet näkevät sen merkityksen vain lähettäessään tulosteen pakkaamista varten ja pitävät sen käyttöä muissa tapauksissa vaarallisena. Mutta usein et yksinkertaisesti voi tehdä ilman lähdön ohjausta.

Varsinkin jos et halua kaivaa syvälle.

PHP tarjoaa useita toimintoja, jotka etsivät yhtä merkkijonoa toisesta. Jotkut palauttavat löydetyn merkkijonon sijainnin (strpos , strrpos ja vastaavat) ja palauttavat osan alkuperäisestä merkkijonosta (strstr ja strrchr). Hakufunktiot palauttavat epätosi, jos etsimääsi merkkijonoa ei löydy alkuperäisestä.

Jos tavoitteesi on yksinkertaisesti määrittää, onko merkkijono olemassa toisessa, tehokkain vaihtoehto on strpos .

strpos

Strpos-funktio etsii ensimmäisestä merkkijonoargumentista toisen ja palauttaa ensimmäisen osuman nollapohjaisen indeksisijainnin merkkijonossa tai false, jos sitä ei löydy. Seuraava esimerkki osoittaa:

$str = ; // etsi sanan "tarve" ensimmäistä esiintymää $str$pos = strpos($str, "tarve"); // $posin näyttötyyppi ja arvo var_dump ($pos) ; // int(3)

Vaikka osoitimme tuloksen yllä var_dump-komennolla, strposin palautusarvon tyypillinen tutkimus suoritetaan seuraavasti:

// kuinka tarkastaa strpos-palautusarvo ($pos) if ( $pos !== false ) ( // jos hakumerkkijono löytyi echo "löytyi sijainnista $pos" ; ) else ( echo "ei löytynyt." ; )

Muista käyttää === tai !==-operaattoreita vertaillaksesi strpos-funktion palautusarvoa false. Jos osamerkkijono löytyy merkkijonon alusta, strpos palauttaa arvon 0, jonka == tai !=-operaattorit muuttaisi vääräksi.

Voit määrittää siirtymän aloittaaksesi haun tietyllä määrällä merkkejä merkkijonon alusta, kuten tämä esimerkki osoittaa:

/* strpos-argumentit: * aihemerkkijono (alias heinäsuovasta), hakumerkkijono (neula), offset (valinnainen) */ // aloita haku "tarve" merkistä 10 kohdassa $str$pos = strpos ($str , "tarve" , 10 ) ; // 20

Kun haku aloitetaan merkistä 10, tuloksena on 20, sanan neulan alun indeksipaikka.

strrpos

Strrpos-funktio etsii alimerkkijonon viimeisen esiintymän sijainnin merkkijonossa:

// esimerkkimerkkijono, jota käytetään hauissa$str = "Meidän täytyy löytää neula heinäsuovasta."; // etsi viimeisimmän "tarve" esiintymän sijainti $str$pos = strrpos($str, "tarve"); // 20

Strrpos-funktio tarjoaa myös valinnaisen offset-parametrin, joka voi olla joko positiivinen tai negatiivinen. Jos siirtymä on positiivinen, merkkijonon alussa oleva merkkimäärä jätetään haun ulkopuolelle. Harkitse seuraavaa esimerkkiä:

// etsi oikealta "Me" pois lukien kolme ensimmäistä merkkiä$pos = strrpos ($str , "Me" , 3 ) ; var_dump ($pos) ; //bool(false)

Tulos on väärä, koska "Me" ei löydy, kun haku sulkee pois kolme ensimmäistä merkkiä.

Jos offset on negatiivinen, niin monta merkkiä merkkijonon lopussa jätetään haun ulkopuolelle. Esitämme kahdella haulla, jotka määrittävät negatiivisen siirtymän:

// etsi oikealta "hay" pois lukien 5 viimeistä merkkiä$pos = strrpos ($str , "heinä" , - 5 ) ; // int(34) // etsi oikealta pois lukien viimeiset 10 merkkiä$pos = strrpos ($str , "heinä" , - 10 ) ; //bool(false)

Viimeinen yllä oleva tulos on epätosi, koska "hay" ei löydy, kun haku sulkee pois viimeiset 10 merkkiä.

Huomaa, että strrpos-funktion palautusarvo antaa sijainnin merkkijonon alusta, vaikka haku alkaa oikealta.

stripoja ja stripoja

Strpos- ja strrpos-funktiot tekevät hakuja, joissa kirjainkoolla on merkitystä. PHP tarjoaa stripos- ja strripos-funktioita suorittamaan hakuja, joissa kirjainkoolla ei ole merkitystä. Ne toimivat aivan kuten niiden isot ja pienet kirjaimet vastaavat:

// esimerkkimerkkijono, jota käytetään hauissa$str = "Meidän täytyy löytää neula heinäsuovasta."; // tee kirjainkoolla välitön haku "me"$pos = stripos($str, "me"); // int(0) // tee kirjainkoolla välitön haku oikealta sanalle "Tarve"$pos = strripos($str, "Tarvitsee"); // int(20)

Haku, jossa kirjainkokoa ei erotella, antaa tulokseksi 0 , mikä tarkoittaa, että se löydettiin sen merkkijonon alusta, josta etsimme. Kirjainkoolla välitön haku sanalla "Tarve" oikealta (käyttäen striposia), löytää sen paikasta 20 .

strstr

Strstr-funktio etsii ensimmäisestä merkkijonoargumentista toista. Jos toinen löytyy ensimmäisestä, strstr palauttaa alkuperäisen merkkijonon osan ensimmäisestä löydetystä esiintymästä merkkijonon loppuun.

// esimerkkimerkkijono $str = "Meidän täytyy löytää neula heinäsuovasta."; // etsi "the" kentässä $str $newstr = strstr ($str , "the" ) ; var_dump ($newstr) ; // string(27) "neula heinäsuovasta."

Strstr-funktio palauttaa ensimmäisen löytämänsä "sen" sekä muun alkuperäisen merkkijonon.

Jos syötät true kolmanneksi argumentiksi arvolle strstr , alkuperäisen merkkijonon osa ennen löydetty merkkijono palautetaan:

// pass true palauttaaksesi osan $str:stä ennen "the"$newstr = strstr ($str , "the" , true ) ; var_dump ($newstr) ; // string(16) "Meidän täytyy löytää"

Tällä kertaa strstr-funktio palauttaa kaiken ennen ensimmäistä "the" merkkijonossa.

PHP tarjoaa myös stristr-funktion, joka toimii täsmälleen samalla tavalla kuin strstr, paitsi että se suorittaa haun, jossa kirjainkoolla ei ole merkitystä.

strhrchr

Strrchr-funktio etsii ensimmäisestä merkkijonoargumentista oikealta toisessa argumentissa määrittämäämme merkkiä. Funktio palauttaa merkkijonon osan kyseisen merkin löydetyn esiintymän sijainnista merkkijonon loppuun:

// esimerkkimerkkijono $str = "Meidän täytyy löytää neula heinäsuovasta."; // etsi oikealta "s":llä $str$newstr = strstr ($str , "s" ) ; var_dump ($newstr) ; // string(6) "pino."

Huomaa, että toisin kuin strstr, jos toinen argumentti koostuu useista merkeistä, vain ensimmäistä käytetään:

// testaa monimerkkinen toinen argumentti$newstr = strrchr ($str , "the" ) ; var_dump ($newstr) ; // string(5) "tack."

Sen sijaan, että palauttaisit "heinäsuovasta", strrchr-funktio palauttaa "tack" -funktion, joka käyttää hakuun vain toisen argumentin ensimmäistä kirjainta.