Kontakty

Pozdravte vám, drahý priateľ! Affiliate program Zlá úspech PHP

Štandardný pamäťový mechanizmus užívateľských relácií v PHP - Skladovanie v súboroch. Avšak, keď je aplikácia spustená na viacerých serveroch na vyváženie zaťaženia, je potrebné tieto stretnutia uložiť v archíve prístupnom pre každý aplikačný server. V tomto prípade je dobré pre ukladanie relácií Redis.

Najobľúbenejším riešením je rozšírenie phperedis. Stačí nainštalovať rozšírenie a konfigurovať php.ini a relácie sa automaticky ukladajú do Redisu bez zmeny kódu aplikácie.

Takéto riešenie však má nevýhodu - nedostatok blokovania relácie.

Pri použití štandardného mechanizmu na ukladanie relácií v súboroch, otvorená relácia blokuje súbor, kým nie je zatvorený. S niekoľkými simultánnymi odvolaniami, prístupom k zasadnutiu, sa očakávajú nové požiadavky, kým predchádzajúca nedokončí prácu so zasadnutím. Pri použití phopredis však neexistuje žiadny blokovací mechanizmus. S niekoľkými asynchrónnymi požiadavkami je závod súčasne a niektoré údaje zaznamenané v relácii sa môžu stratiť.

Je ľahké kontrolovať. Pošleme 100 požiadaviek na server asynchrónne, z ktorých každý píše svoj parameter na reláciu, potom zvážte počet parametrov v relácii.

Skúšobný skript

"; Prestávka;)


V dôsledku toho získame, že v relácii nie je 100 parametrov a 60-80. Zostávajúce údaje, ktoré sme stratili.
V reálnych aplikáciách, samozrejme, 100 simultánnych žiadostí nebude však, prax ukazuje, že aj s dvoma asynchrónnymi simultánnymi požiadavkami, údaje zaznamenané jedným z požiadaviek sú často udržiavané iným. Použitie predĺženia PhPredis pre skladovanie relácií je teda nebezpečné a môže viesť k strate dát.

Ako jeden z riešení problému - vaše SessionandlerPodporné zámky.

Predaja

Ak chcete nastaviť zámok relácie, nastavte hodnotu zámku kľúča na náhodne generované (na základe hodnoty Uniqid). Hodnota musí byť jedinečná, aby mohla prístup k akejkoľvek paralelnej žiadosti.

Chránené funkčné uzamknutie ($ SESSESID) ($ SESSASTE \u003d (1000000 * $ This-\u003e LockMaxWait) / $ This-\u003e SpinLocKwait; $ This-\u003e Token \u003d Uniqid (); $ This-\u003e< $attempts; ++$i) { $success = $this->redis-\u003e Set ($ This-\u003e Getrediskey ($ This-\u003e LockeKey), $ This-\u003e Token, ["NX",]); IF ($ Supky) ($ This-\u003e LOCKED \u003d TRUE; VRÁTENIE TRUE;) USLEEP ($ THOTO-\u003e SPINOWNLOCKWAIT); ) Návrat false; )
Hodnota je nainštalovaná s vlajkou Nx., To znamená, že inštalácia nastane len vtedy, ak nie je takýto kľúč. Ak existuje takýto kľúč, po chvíli sa pokúšame znova.

Môžete tiež použiť obmedzenú životnosť v reďkovi, avšak čas prevádzky skriptu je možné zmeniť po nastavení kľúča a paralelný proces môže pristupovať k relácii, kým nie je dokončená v aktuálnom skripte. Keď je skript dokončený, kľúč sa v každom prípade vymaže.

Pri odomknutí relácie, keď je skript vypnutý na odstránenie kľúčov, použite Lua.-scenár:

Private funkcie Odomknutie () ($ Script \u003d<<redis-\u003e Eval ($ Script, Array ($ This-\u003e Getrediskey ($ This-\u003e LockeKey), $ This-\u003e Token), 1); $ this-\u003e uzamknuté \u003d false; $ this-\u003e token \u003d null; )
Použite príkaz Del. Je to nemožné, pretože používate ho môžete odstrániť kľúč nainštalovaný iným skriptom. Takýto scenár zaručuje vymazanie len vtedy, ak blokovací kľúč zodpovedá jedinečnej hodnote nastavenej aktuálnym skriptom.

Kód úplného triedy

trieda RedissessionHandler implements SessionHandLerLinterFace (chránený $ Redis; chránený $ TTL; chránená $ prefix; chránený $ camped; Private $ Lockekey; Private $ token; Private $ WINTINOWWAIT; Verejná funkcia __Construct (Redis $ Redis, $ Prefix \u003d "Phpredis_session:", $ Dinocieckwait \u003d 200000) ($ This-\u003e Redis \u003d $ Redis; $ This-\u003e TTL \u003d ini_Get ("gc_maxlifetime"); $ inImaxexecutionTime \u003d ini_get ("max_execution_time"); $ Toto-\u003e LockMaxWait \u003d $ INIMAXEXECTIMETIME? $ INIMAXEXECIONTIMETIOU * 0.7: 20; $ This-\u003e Prefix \u003d $ Prefix; $ This-\u003e Locked \u003d False; $ This-\u003e Spinockey \u003d null; $ spinocwwait;) Verejná funkcia otvorená ($ UložiťPath , $ Sessionname) (návrat true;) chránená funkcia uzamknutia ($ sessionID) ($ pokusy \u003d (1000000 * $ This-\u003e LockMaxwait) / $ This-\u003e Token \u003d Uniqid (); $ TOTO-\u003e lockekey \u003d $ sessionID. ".LOCK"; pre ($ I \u003d 0; $ I< $attempts; ++$i) { $success = $this->redis-\u003e Set ($ This-\u003e Getrediskey ($ This-\u003e LockeKey), $ This-\u003e Token, ["NX",]); IF ($ Supky) ($ This-\u003e LOCKED \u003d TRUE; VRÁTENIE TRUE;) USLEEP ($ THOTO-\u003e SPINOWNLOCKWAIT); ) Návrat false; ) Súkromná funkcia odomknutie () ($ skript \u003d<<redis-\u003e Eval ($ Script, Array ($ This-\u003e Getrediskey ($ This-\u003e LockeKey), $ This-\u003e Token), 1); $ this-\u003e uzamknuté \u003d false; $ this-\u003e token \u003d null; ) Verejná funkcia Zatvoriť () (ak ($ \u200b\u200bThis-\u003e uzamknuté) ($ This-\u003e Unlocksession ();) Návrat TRUE;) Verejná funkcia Read ($ SESSESID) (ak (! $ This-\u003e Uzamknuté) (IF (! $ this-\u003e uzamknutie ($ sessionID)) (návrat false;)) návrat $ this-\u003e redis-\u003e getrediskey ($ sessionID))?: "";) Verejná funkcia Write ($S Sessid, $ Data) (IF ($S) This-\u003e TTL\u003e 0) ($ This-\u003e Redis-\u003e Setex ($ This-\u003e Getrediskey ($ Sessid), $ This-\u003e TTL, $ Data);) inak ($ \u200b\u200bThis-\u003e Redis-\u003e Set ($ Tento-\u003e getrediskey ($ sessionid), $ data);) návrat true;) Verejná funkcia zničiť ($ Sessid) ($ This-\u003e Redisey ($ Sessid)); $ This-\u003e Zatvoriť (); Vrátenie TRUE;) Verejná funkcia GC ($ Lifetime) (Return True) Verejná funkcia SettTTL ($ TTL) ($ THOTO-\u003e TTL \u003d $ TTL;) Verejná funkcia GetLockMaxwait () (Return $ This-\u003e LockMaxWait; ) Verejná funkcia SETLOCKMAXWAOT ($ LockMaxWait) ($ This-\u003e LockMaxWait \u003d $ LockMaxWait;) Chránená funkcia Getrediskey ($ Key) (Prázdne ($ This-\u003e Prefix)) (Návrat $ THEY;) Return. $ this-\u003e Prefix. $ Kľúč; ) Verejná funkcia __Destruct () ($ This-\u003e CLOSE ();)

Pripojenie

$ redis \u003d nový redis (); Ak ($ Redis-\u003e Connect ("11.111.111.11", 6379) && $ Redis-\u003e SELECT (0)) ($ handler \u003d NOVÉHOPRODENIE ($ REDIS); session_set_save_handler ($ handler);) session_start ();

Výsledok

Po pripojení našich Sessionandler Náš testovací skript s dôverou vykazuje 100 parametrov v relácii. Zároveň, napriek blokovaniu, celkový čas spracovania 100 požiadaviek sa mierne pestuje. V skutočnej praxi nebude takýto počet simultánnych žiadostí. Prevádzka skriptu je však zvyčajne podstatnejšia a so simultánnymi dotazmi môže byť viditeľné čakanie. Preto musíte premýšľať o znížení času práce s reláciou skriptu (volanie session_start () len v prípade potreby práce so zasadnutím a session_write_close () Po ukončení práce s ním)

Požiada o server bez reštartu stránky. Toto je metóda nízkej úrovne, ktorá má veľký počet nastavení. Podporuje prácu všetkých ostatných metód AJAX. Má dve použitia:

url - Pridať žiadosť.
nastavenie - V tomto parametri môžete nastavenia pre túto požiadavku nastaviť. Nastaví objekt vo formáte (Názov: Hodnota, Názov: Hodnota ...). Žiadna z nastavení nie je povinná. Predvolené nastavenia môžete nastaviť pomocou metódy $ .ajaxsetup ().

Zoznam nastavení

↓ Názov: Typ (predvolená hodnota)

Pri vykonávaní dotazu, hlavičky (hlavičky) označujú prípustné typy obsahu očakávaný od servera. Hodnoty týchto typov budú prevzaté z parametra akceptov.

V predvolenom nastavení, všetky požiadavky bez reštartovania stránky sa vyskytujú asynchrónne (to znamená, že po odoslaní žiadosti o server, stránka nezastaví svoju prácu pri čakaní na odpoveď). Ak potrebujete synchrónne vykonanie dotazu, nastavte parameter na FALSE. Požiadavky na kríženie a požiadavky ako "JSONP" nie je možné vykonať v synchrónnom režime.

Majte na pamäti, že vykonanie dotazov v synchrónnom režime môže mať za následok blokovanie stránky, kým sa žiadosť nebude plne splnená.

Toto pole obsahuje funkciu, ktorá bude nazývaná priamo pred odoslaním požiadavky AJAX na server. Táto funkcia môže byť užitočná pre modifikáciu objektu JQXHR (v predčasné verzie Knižnice (do 1.5), namiesto JQXHR používa XMLHTTPREQUEST). Môžete napríklad zmeniť / špecifikovať potrebné hlavičky (hlavičky) i.d. Objekt JQXHR bude prenášaný na funkciu prvého argumentu. Druhý argument prejde nastavenia dotazu.

V tomto poli môžete zadať ďalšie hlavičky dotazu (hlavička). Tieto zmeny budú zadané pred výzvou na bezporusend, v ktorom môžu byť konečné editory.

Pri prevode tohto nastavenia na hodnotu TRUE, dotaz bude vykonaný so stavom "úspešným", len ak odozva zo servera sa líši od predchádzajúcej odpovede. JQuery kontroluje túto skutočnosť s odkazom na poslednú upravenú hlavičku. Počnúc jQuery-1,4, okrem posledného upraveného a "ETAG" sa tiež skontroluje (obaja poskytujú server a sú potrebné oznámiť prehliadač, že požadované údaje zo servera sa nezmení z predchádzajúcej požiadavky).

Umožňuje nastaviť stav zdroja polohy stránky (ako keby sa to stalo prostredníctvom protokolu súborov), aj keď JQuery to neuznal inak. Knižnica rozhoduje, že stránka je spustená lokálne v prípade nasledujúcich protokolov: súbor, * -extension a widget.

Odporúča sa nastaviť hodnotu parametra islocal Globálne - pomocou funkcie $ .ajaxsetup () a nie v nastaveniach individuálnych požiadaviek AJAX.

Určuje názov parametra, ktorý je pridaný do adresy URL s dotazom JSONP (štandardne, "Callback" sa používa - "http: //sitename.ru? Callback \u003d ...").

Počnúc jQuery-1.5, zadanie v tomto falošnom parametri, zabránite pridaniu adries URL dodatočný parameter. V tomto prípade je potrebné výslovne nastaviť hodnotu majetku spoločnosti JSONPCallback. To je napríklad: (JSONP: FALSE, JSONPCALLOCK: "CallBackName").

Definuje názov funkcie, ktorá bude volaná pri odpovedaní na server na požiadanie JSZZ. Štandardne JQuery generuje ľubovoľný názov tejto funkcie, čo je výhodnejšia možnosť, ktorá zjednodušuje prevádzku knižnice. Jedným z dôvodov, v ktorých je určiť vlastnú funkciu spracovania JSONP dotazov, je zlepšiť ukladanie do pamäte cache získať požiadavky.

Počnúc jQuery-1.5 môžete v tomto parametri zadať funkciu, aby ste mohli spracovať odpoveď servera. V tomto prípade musí zadaná funkcia vrátiť údaje prijaté zo servera (v zadanej funkcii, budú k dispozícii v prvom parametri).

V predvolenom nastavení sú všetky údaje prenášané na server pre-konvertované na reťazec (formát URL: fname1 \u003d hodnota1 & fname2 \u003d hodnota2 & ...) Zodpovedajúce "aplikačné / x-www-form-urlencoded". Ak potrebujete odosielať údaje, ktoré nie je možné podrobiť podobnému spracovaniu (napríklad DOCUMENT), potom by ste mali vypnúť možnosť ProcessData.

Tento parameter sa používa pre krížové domény AJAX typu get, DataType môže byť alebo "JSONP" alebo "Script". Určuje kódovanie, v ktorom sa vykoná dotaz krížového priestoru. Toto je potrebné, ak server na doméne niekoho iného používa kódujúce iné ako kódovanie na natívnom serveri domény.

(Toto nastavenie sa objavilo v jQuery-1,5) Súprava pary, v ktorej sú kódy vykonávania dotazov v porovnaní s funkciami, ktoré budú spôsobené. Napríklad pre kód 404 (neexistujú), môžete na obrazovku kresliť správu:

$ .ajax (stavcode: (404: Funkcia () (ALERT) "Stránka nenájdená") ; } } } ) ;

Funkcie, ktoré reagujú na úspešné kódy dotazov, dostanú rovnaké argumenty ako funkcie úspešného vykonania dotazu (špecifikované v parametri úspechu) a funkcie, ktoré fungujú na chybových kódoch, budú rovnaké ako funkcie chýb.

Funkcia, ktorá bude volaná v prípade úspešného ukončenia požiadavky servera. Bude prenášané tri parametre: Údaje zasielané serverom a už prešli predbežným spracovaním (čo je vynikajúce pre rôzne datatype). Druhý parameter je reťazec s stavom vykonania. Tretí parameter obsahuje objekt JQXHR (v skorších verziách knižnice (až 1,5), namiesto JQXHR používa XMLHTTTPREAKEST). Počnúc jQuery-1,5, namiesto jednej funkcie, tento parameter môže mať rad funkcií.

Čas na odpoveď zo servera. V milisekundách. Ak je tento čas prekročený, dotaz bude doplnený s chybou a vyskytne sa udalosť chýb (pozri vyššie uvedený popis), ktorý bude mať stav "Timeout".

Čas sa počíta od okamihu volania funkcie $ .ajax. Môže sa stať, že v tomto okamihu sa spustí niekoľko ďalších požiadaviek a prehliadač odloží vykonanie aktuálnej žiadosti. V tomto prípade Čas vypršal. Môže to skončiť, hoci v skutočnosti, žiadosť ešte nebola spustená.

V JQUERE-1.4 a mladšej, na konci čakacej doby sa XMLHTTPREQUEST objekt prepne na chybový stav a prístup k jeho poliam môže spôsobiť výnimku. V Firefox 3.0+ Dotazy typu skriptu a JSONP nebudú prerušené, keď je prekročenie čakania. Budú dokončení aj po uplynutí tejto doby.

Funkcia, ktorá poskytne objekt XMLHTTPREAKEST. V predvolenom nastavení je prehliadač IE tento objekt ActiveXObject a v iných prípadoch je XMLHTTTPROEST. S týmto parametrom môžete implementovať vlastnú verziu tohto objektu.

(Toto nastavenie sa objavilo v jQuery-1.5.1) Sada párov (Názov: Znamenie) na zmenu / pridanie hodnôt zodpovedajúcich polí XMLHTTPTPREQUEST objektu. Môžete napríklad nastaviť svoje srdečné vlastnosti v TRUE, pri vykonávaní dotazu Crosscain:

$ .ajax ((URL: A_CROSS_DOMAIN_URL, XHRFLIES: (sccredentials: TRUE));

V jquery-1,5 Vlastnosťou scredentials nie je podporovaná natívnym XMLHTTTPROEST a s dotazom CrossDomeden Toto pole bude ignorované. Vo všetkých nasledujúcich verziách knižnice je stanovená.

Puzdrá na udalosti

Beforesert, Error, DataFilter, úspech a úplné nastavenia (ich popis v predchádzajúcej časti) vám umožňujú vytvoriť manipulátory udalostí, ktoré sa vyskytujú v určitých bodoch pri vykonávaní každého dotazu AJAX.

beforesend. Stáva sa to okamžite pred odoslaním požiadavky na server. chyba sa deje v prípade neúspešného vykonávania dotazu. dataFilter. sa stane v čase príchodu údajov zo servera. Umožňuje zvládnuť údaje "RAW" odoslané serverom. Úspech. Vyskytuje sa v prípade úspešného ukončenia žiadosti. dokončiť. sa deje v prípade akéhokoľvek ukončenia žiadosti.

Príklad jednoduché použitie. Odoberáme správu s úspešným vykonaním dotazu:

$ .ajax ((URL: "AJAX / test.html", úspech: Funkcia () (upozornenie ("zaťaženie.");))););

Počnúc JQUYERE-1.5, metóda $ .ajax () vráti objekt JQXHR, ktorý okrem iného implementuje odložené rozhranie, ktoré vám umožní nastaviť ďalšie realizačné manipulátory. Okrem štandardného .dónu (), .Fail () i.then () metódy pre odloženú (), s ktorými môžete inštalovať manipulátory, sú implementované v jqxhr.success (), .error () a.skLive () . To sa robí na splnenie obvyklých menách metód, s ktorými sú nastavované manipulátory vykonávania dotazov AJAX. Avšak, počnúc jQuery-1.8, tieto tri metódy budú nežiaduce na použitie.

Pre niektoré typy dotazov, ako je JSONP alebo CrossDomeds získať dotazy, nie je k dispozícii na používanie XMLHTTPREQUEST objektov. V tomto prípade, prenášané na XMLHTTPREQUEST a manipulátory textu, bude obsahovať nedefinovanú hodnotu.

Vnútorné manipulátory bude táto premenná obsahovať hodnotu parametra kontext.. V prípade, že neboli zadané, bude to obsahovať objekt nastavení.

Dátový typ

Funkcia $ .ajax () zistí, že typ dátového servera odoslaného zo samotného servera (nástroje MIME). Okrem toho je možné osobne špecifikovať (objasniť), ako interpretovať tieto údaje. Toto sa vykonáva pomocou parametra DataType. Možné hodnoty tohto parametra:

"XML" - Výsledný dokument XML bude k dispozícii v textovej forme. Môžete s ním pracovať Štandardné prostriedky jQuery (ako aj s dokumentom HTML). "HTML" - Prijaté HTML bude k dispozícii v textovom formulári. Ak obsahuje skripty v tagoch



V tomto príklade pomocou metódy jQuery .naložiť () Sme stlačení na prvok

Páči sa vám článok? Zdieľaj to