ugrás a tartalomhoz

PHP - amit senki nem mondd el egy kezdőnek

Mikulasche · 2013. Okt. 23. (Sze), 20.18
Erre is magamnak kellett rájönnöm.

Meghívsz egy php file-t amiben nincs echo/print csak összerak valamit és visszaküldi annak a lapnak ahonnan meghívták.

header locationnal megy vissza

ha a location átirányítás sor után még vannak utasítások és függvények
azok végrehajtódnak annak ellenére, hogy az átirányítás már átdob.

/Ha csak nem irsz neki exit; -et location után/

Te már rég messsze jársz a php azonban szépen lefuttja a location utáni kódot.

Persze hogy hiba miatt jöttem rá erre.

Bent maradt egy session destroy a kód végén.
De én már jóval előbb header locationnal átmentem onnan.
Nem értettem mért nem működik a kódom.
Mert nem volt exit-em a session destroy lefutott,
csak néztem hol vannak a session változók.

Ez annyira egyszerű, épp ezért nem mondja el senki.
 
1

Megnéztem a header() függvény

Hidvégi Gábor · 2013. Okt. 23. (Sze), 20.33
Megnéztem a header() függvény dokumentációját, valóban ott nem írnak erről.

A php úgy működik, hogy két belső puffere van: egy a http fejléceknek, egy pedig a html kódnak. Mivel egyszerre több fejlécet is meg lehet adni, amelyek egyszerű karakterláncok, ezeket beteszi szépen a belső puffertömbjébe, ahogy egymás után hívogatod a header() függvényt, majd a végén, miután végetért a script, összeragasztja a két puffert, és kiküldi a kliensnek.

Tovább bonyolítja a dolgot, hogy a webszerver (pl. Apache) saját belső pufferekkel dolgozik, és felülírhatja a te fejléceidet, amit a header() függvényben megadtál.
2

Miért kéne megszakadnia a

MadBence · 2013. Okt. 23. (Sze), 20.41
Miért kéne megszakadnia a futásnak? A PHP-nak honnan kéne tudnia, hogy a header(...) egy átirányítás volt?
3

Persze hogy evidens

Mikulasche · 2013. Okt. 23. (Sze), 20.53
Miután már látom és értem teljesen logikus, hisz a php lefut a szerveren, hogy közben a kliensnek kiküldött valamit, attól ő még megy tovább ha nincs ami megakasztja.

Apró és egyszerű dolog, kezdőknek jó tudni.
Én is az vagyok.

Jó lenne itt ilyen apró evidenciákat gyűjtögetni.
Annyira egyerű, hogy senki le nem írja, de mire magad rájösz egy hiba kapcsán ...
4

Konkrétan ez a php.net-es

tgr · 2013. Okt. 23. (Sze), 22.06
Konkrétan ez a php.net-es dokumentációban a példa szövege:

<?php
header("Location: http://www.example.com/"); /* Redirect browser */

/* Make sure that code below does not get executed when we redirect. */
exit;
?>
5

Pontosabban

Pepita · 2013. Okt. 24. (Cs), 01.02
A PHP-nak honnan kéne tudnia, hogy a header(...) egy átirányítás volt?
Ezt tudnia kell a header szövegéből (location).
Viszont épp azért nem száll ki, mert egyes esetekben szükséged lehet pl. egy hosszabb kód futtatására, aminek a kimenethez (mivel az egy másik oldal) semmi köze, de a szerveren fontos műveleteket végzel (pl. adatbázissal).
Tehát épp az lenne a baj, ha magától kitalálná az exitet, mert előbb kiolvassa, hogy location. Nekünk jobb így, nem nagy dolog odafigyelni rá.

A másik az exittel kapcsolatban, hogy ha bonyolultabb, szerteágazó kódot írsz, akkor ugye egy fv-ből is kiszállsz egy return-el, ahol lehet, a PHP-ból meg exit-el. Sőt, megadhatsz paramétert is, hogy hibával szálltál ki (pl. ha 404-et dobsz).

Kifejezetten jó nekünk, hogy "nem tudja".
6

Normális kód ugye eleve nem

tgr · 2013. Okt. 24. (Cs), 10.00
Normális kód ugye eleve nem exittel száll ki soha, mert a kontroller (aminek tipikusan felelőssége az átirányítás) nem tudhatja, hogy vannak-e magasabb szinten függőben lévő feladatok, amiket még el kell végezni, tracking, logging, akármi.
7

Cli-s kódok

gabesz666 · 2013. Okt. 24. (Cs), 10.24
Azért egy cli-ben futtatott batch script például szerintem tipikusan olyan, aminek exit-el kellene végződnie.
8

Persze, ha

Pepita · 2013. Okt. 25. (P), 01.35
MVC-ben gondolkodunk, de ott is élhet a
megadhatsz paramétert is, hogy hibával szálltál ki (pl. ha 404-et dobsz).

Ezért írtam én is elsőként a fv-ből return-t, ez (exit) a ritkábbik eset, de előfordul. A soha szerintem túlzás, épp átirányítás miatt lehet érdekes, még MVC-ben is. De ez lehet programozói gondolkodás-különbség is, egyikünkre se merném itt mondani, hogy tuti igaza van. Lehet, hogy soha, szerintem ritkán.