Avatar billede bearhugx Nybegynder
04. oktober 2004 - 16:07 Der 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 ... ???

/Søren
Avatar billede dennismp Nybegynder
04. oktober 2004 - 16:16 #1
Kan du ikke bruge shared memory (shm_attach osv) ?
Avatar billede bearhugx Nybegynder
04. oktober 2004 - 16:25 #2
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...
Avatar billede dennismp Nybegynder
04. oktober 2004 - 16:39 #3
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 .. :-)
Avatar billede swaxi Nybegynder
04. oktober 2004 - 22:39 #4
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 ?
Avatar billede dennismp Nybegynder
04. oktober 2004 - 22:47 #5
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.
Avatar billede bearhugx Nybegynder
04. oktober 2004 - 23:16 #6
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å...

/Søren
Avatar billede dennismp Nybegynder
05. oktober 2004 - 08:28 #7
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?
Avatar billede bearhugx Nybegynder
08. januar 2005 - 00:28 #8
lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester