04. oktober 2004 - 16:07Der er
7 kommentarer og 1 løsning
in-memory persistens af application wide vars ?
Hej eksperter
Problematikken er nævnt til hudløshed før på eksperten - nemlig omkring en global.asa-ækvivalent i PHP
Jeg har ledt rundt på nettet og fundet nogle triks til, hvordan man kan lave en global.asa-lignende $_APP variabel ... Problemet med den løsning, jeg har fundet, er dog, at hver gang denne variabel ikke er i memory, så hentes den ind fra en fil via include...
I mit tilfælde, hvor det drejer sig om en mængde af forholdsvis statiske tabeller af brugerrettigheder, osv., vil dette betyde at i ca. 99,9999% af tilfældene vil dette hentes ind fra disk igen... - Og så er jeg jo vel ikke langt fra bare at hente tabellerne ind igen fra DB'en ??
Kan det virkelig passe, at man ikke kan gemme en datastruktur i memory som eksisterer på tværs af kald til scripts (og på tværs af SESSION's) ?
Og hvis nej - har der været snak om at det ville blive muligt på et tidspunkt, eller ... ???
hmmm ... har aldrig brug de funktioner - det ser ret kompliceret ud ... Der står også at det er til System V ... Er det ikke UNIX ?? .. Derudover skal man rekompilere PHP med et bestemt flag for at få det til at virke ....
Bottom line -- SHM er så kompliceret at det måske bedre kan betale sig, rent tidsmæssigt, bare at hente det ind fra DB'en hele tiden...
Jo, det er nok kun til unix systemer.. Det er nok nemmest for dig at bruge databasen.. Hvis det er mysql, kan du oprette tabeller med typen head (det giver dog nogle begrænsinger, såsom du ikke kan bruge kolonnetypen text og lign). Head betyder bare at det bliver gemt i hukommelsen.
Men omvendt, så vil de data jo nok alligvel blive smidt i ram, da MySQL cacher dem. Og de bliver vel indlæst ret tit..
Jeg tror ikke de vil lave noget support a la global.asa i PHP. Man kan det jo egentlig via shared memory.
Men det kunne da være en overkommelig opgave at lave en extension der gjorde det du efterlyser. hmm .. :-)
et PHP-script forbliver kun i memory sålænge request'et varer. det betyder, at du ikke kan beholde noget i hukommelsen imellem disse. du kan selvf. bruge $_SESSION, men det PHP gør er, at smide indholdet af SESSION ned i en tmp-fil mellem request'ene. så faktisk er $_SESSION en slags emulering af hukommelse, der transisterer mellem request's, og dermed nok også det, der kommer tættest på det du søger ?
Så vidt jeg har forstået, så er det ikke session han ønsker. Men persistent variabler, der lever på tværs af tid og scripts. Altså ikke afhængig af sessions eller noget andet.
Egentligt er det vel grim kode og jeg kan ikke finde ud af, om det overhovedet kan betale sig at prøve at lave sådan en extension.
Jeg har tænkt over det og kompromisset bliver i dette tilfælde nok også, at jeg gør følgende
1) Holder tabellerne persistent i databasen 2) Henter en kopi ind i en datastruktur, som kommer til at ligge i hver brugers session 3) har en dummy-fil, som bliver touchet (dvs. sat nyt tidspunkt på) hver gang en af sessions'ne laver en ændring i tabellen 4) hver gang jeg tilgår tabel-data'ene tester jeg på om en gemt timestamp (i session) er anderledes end det, som min dummy-fil har påskrevet 5) i det tilfælde læser jeg tabellerne ind igen fra databasen - og erstatter derved session-variablen med en "opfrisket kopi"
præcis punkt 2 var egenligt det, jeg ville undgå - kan ikke se, hvorfor nogle app-wide data skal gemmes i en session-fil for hver bruger.... -- og at jeg bliver nød til at bruge en dummy-fil som et flag til at sige "hey!, nogen har ændret i tabellen, så nu er det på tide at du opdaterer..."...
Men dette er nok det tætteste, jeg kommer på en forholdsvis transperant måde at arbejde med application wide data på...
Jeg forstå ikke hvorfor du vil blande sessions ind i det. Nu ved jeg ikke hvor ofte disse APP data bliver ændret men jeg ville nok:
bruge auto_prepend featuren, som kalder et script der enten 1) Ved sjældent opdatering: Loader data fra en fil. 2) Ved ofte opdatering: Loader fra database
og
auto_append til at lave et script der detekterer om indholdet er ændret 1) Sjældent: At låse og gemme data i filen 2) Ofte: At opdaterer databasen
Hvor "global" er global.asa? Er den global for hele siden (virtual host) eller pr directory?
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.