Lógó szkriptek a php

Az egyik legbizarrabb "hibakereső" PHP az a tény, hogy bizonyos körülmények között lehetetlen egyszerre ugyanazt a szkriptet (vagy akár különböző szkripteket) futtatni ugyanazon a kiszolgálón többször is.

Minden többé-kevésbé tapasztalt programozó tudta, hogy a PHP beépített mechanizmussal rendelkezik az adatok tárolására kérések között, amelyet "munkamenetek" -nek neveznek.

Ennek lényege (ha senki nem tudja) a spoiler alatt van.

A munkamenetek lényege, hogy a szkript befejezésekor a $ _SESSION változó teljes tartalma automatikusan sorozatosan (sztringbe csomagolva) lesz, és egy speciális fájlban tárolódik egy ideiglenes mappában. A következő kérésre ez a fájl automatikusan olvasható, deserializált, és az így kapott tartalom a $ _SESSION változóra íródik.

Így a szkriptnek azt a benyomását kelti, hogy minden, ami $ _SESSION változóba íródott, "örökre" él, vagyis nem szűnik meg anélkül, hogy nyomot hagyna a szkript befejezésekor (a szokásos változókkal ellentétben).

A név az ideiglenes fájlt, amelyben a változó tartalmát a $ _SESSION menti határozza meg az úgynevezett session ID vagy a session_id, vagy a SID. A következő kéréshez, hogy sikeresen olvassa el ugyanazokat az adatokat, a munkamenet-azonosítót valahol el kell tárolni és át kell adni a következő kérésben. Jellemzően ez a süti, vagy egy további változót a GET kérés (úgy néz ki, mint egy fajta kívül? SID = ab87d9f98e09da az URL-jét), a POST kérés, vagy egy különleges süti a neve a SID.

A szabványos PHP-munkamenetek hibája (vagy inkább egy szolgáltatás) az, hogy a szekció adatainak tárolására szolgáló fájl blokkolva van a hozzáféréshez, amíg a szkript fut. Ez nem véletlen, de szándékos, hogy a fájl felülírása más forgatókönyvvel, az adatok nem vesztek.

A gyakorlatban azonban ez tükrözi az a tény, hogy ez fizikailag lehetetlen, hogy elküldi a egyidejű feldolgozását két script azonos munkamenet-azonosítót. Ha egy script már megkezdődött, és megnyitotta az ülést (a session_start () vagy a munkamenet automatikusan kinyílnak - lehetőség van a php.ini-ben), így ha az ülésen nem áll rendelkezésre más szkriptek (és ez lehet egy második példánya azonos írásmóddal) kísérlet arra, hogy nyissa meg a munkamenet, akkor csak tegye a végtelenségig - vagyis amíg az első forgatókönyv elkészült, vagy időtúllépés történik.

Ugyanaz a pontos hatás akkor jelenik meg abban az esetben, ha egy parancsfájlból egy másik webhely forgatókönyvébe próbálkozik. Ebben az esetben az ütközéseket okozott egy script, hogy blokkolja a hozzáférést a munkamenetet, és tarts session_start vonal (), egy első script, ami miatt ez is lefagy, mert vár választ a második okozta script.

És most, ha tudja, mi a probléma, akkor valószínűleg már megértette, hogyan kerülhető el az ilyen helyzetek. Nos, azok számára, akik nem hiszem, hozok számos döntést, vagy még helyesen, szabályokat, hogyan kell eljárni, hogy ne essen a csapdába.

Ne használja a munkamenetet, hacsak nem szükséges. Ha például a parancsfájl futtatása a cron-ból történik, az session_start () nem szükséges megnyitni a munkamenetet, mert még mindig nem tudja átvinni a SID-t tartalmazó cookie-t.

Szkriptet készítsen a munkamenet gyors és egyszerű használatáról. Az ötlet az, hogy a felhasználónak nincs vágya arra, hogy másik linkre kattintson az első megnyitásakor. Ha ezt teszi, akkor a második szkript lefagy az első szkript végrehajtásának vége felé, és a felhasználónak még tovább kell várnia, amíg végül el nem hagyja az oldalt.

Próbálja meg, hogy ne hívja fel a szkriptjeit a saját webhelyének oldalain. Olyan dolgokat értek

Vagy ha szükséges, zárja be az értekezletet a hívás előtt, majd nyissa meg újra. Körülbelül:

Feliratkozás a blogomra és kapcsolatba léphet velem!