/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Session - det forstår jeg ikke helt
Fra : Bertel Lund Hansen


Dato : 08-04-06 13:35

Hej alle

Jeg har et program der læser en fil med medlemsoplysninger,
filtrerer data og præsenterer dem 10 ad gangen på en HTML-side.
Det er en PHP-side der kalder sig selv via an forms action.

Jeg har brugt skjulte inputfelter til at overføre variable mellem
de forskellige kald. Det er nemt nok.

Jeg har også sat en sessiion i gang i starten og bruger
session-variable for at de bliver husket mellem hvert kald. Det
fungerer også.

Men! ... hvis jeg prøver at læge filoplysningerne i en
sessionvariabel, så går serveren i spåner og melder fejl
500-etellerandet.

I princippet ser det sådan ud:

<?
session_start();

if (!isset($_SESSION['filecontent'])) {
   $_SESSION['filecontent'] = explode("\n", file_get_contents(MEMBERFILENAME));
   while (strlen(end($_SESSION['filecontent']))<4) array_pop($filecontent); // Fjern tomme linjer
   $antal=count($_SESSION['filecontent']);
}

[en masse PHP- og HTML-kode ...]

if (isset($vis)) {
   foreach ($_SESSION['filecontent'] as $dataline) {
      list ($nam,$mal,$yea,$brn,$liv,$zip,$hmp)=explode('!',$dataline);
      if ($name>'' ...
      if ($year>'' ...
      if ($born>'' ...
      if ($zipc>'' ...
      if ($live>'' ...
      $show=true;
osv.
}
?>

Jeg havde en tidligere version af programmet hvor jeg brugte
samme metode, og jeg mente selv at jeg fik det til at virke, men
da jeg skulle tjekke det i forbindelse med revisionen, virkede
det heller ikke.

Måske skal jeg bare læse mere om sessions, men måske er der en
der lige kan komme med det rigtige indspark?

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

 
 
Geert Lund (08-04-2006)
Kommentar
Fra : Geert Lund


Dato : 08-04-06 13:44

Bertel Lund Hansen wrote:

> Men! ... hvis jeg prøver at læge filoplysningerne i en
> sessionvariabel, så går serveren i spåner og melder fejl
> 500-etellerandet.

Æh - 500 et eller andet? Du må da kunne give en bedre fejlbeskrivelse
end det? Er det en Apache fejl, en PHP fejl eller hvad du får retur?


Og hvad præcis tilføjer du i din kode der giver ovenstående fejl?


--
Med venlig hilsen
Geert Lund,
www.GLD.dk

Bertel Lund Hansen (08-04-2006)
Kommentar
Fra : Bertel Lund Hansen


Dato : 08-04-06 14:58

Geert Lund skrev:

> Æh - 500 et eller andet? Du må da kunne give en bedre fejlbeskrivelse
> end det? Er det en Apache fejl, en PHP fejl eller hvad du får retur?

Det ved jeg ikke. Der stod noget med at serveren ikke kunne hitte
ud af det og at man skulle kontakte mig for at få besked om hvad
der var galt.

Nu kan jeg ikke reproducere fejlen på samme måde. Nu fungerer
siden tilsyneladende okay, men der er bare ingen data læst ind.

Hvis jeg fjerner tjekket så medlemsfilen genlæses hver eneste
gang fungerer det hele, og det er sådan siden er lavet nu
(<http://fiduso.dk/?page=medlemmer>)

> Og hvad præcis tilføjer du i din kode der giver ovenstående fejl?

Det er den indledende test:

if (!isset($_SESSION['filecontent'])) {
....
}

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Geert Lund (08-04-2006)
Kommentar
Fra : Geert Lund


Dato : 08-04-06 16:17

Bertel Lund Hansen wrote:

> Det er den indledende test:
> if (!isset($_SESSION['filecontent'])) {

Jeg vil gætte på at Michaels svar til dig er korrekt. Du gemmer
formentlig for mange data i din session.

Hvor stor er den fil du indlæser i din session?

--
Med venlig hilsen
Geert Lund,
www.GLD.dk

Michael Zedeler (08-04-2006)
Kommentar
Fra : Michael Zedeler


Dato : 08-04-06 15:23

Bertel Lund Hansen wrote:
> Jeg har også sat en sessiion i gang i starten og bruger
> session-variable for at de bliver husket mellem hvert kald. Det
> fungerer også.
>
> Men! ... hvis jeg prøver at læge filoplysningerne i en
> sessionvariabel, så går serveren i spåner og melder fejl
> 500-etellerandet.
>
> I princippet ser det sådan ud:
>
> <?
> session_start();
>
> if (!isset($_SESSION['filecontent'])) {
>    $_SESSION['filecontent'] = explode("\n", file_get_contents(MEMBERFILENAME));
>    while (strlen(end($_SESSION['filecontent']))<4) array_pop($filecontent); // Fjern tomme linjer
>    $antal=count($_SESSION['filecontent']);
> }

En mulighed er at filen er stor. Det belaster serveren temmelig
voldsomt, hvis du f. eks. indlæser en fil på en megabyte i
sessionsobjektet. Prøv at lave en meget kort fil og se om det ændrer
noget. Generelt ser det ud som om at du er i gang med at bruge
sessionsobjektet til noget, det ikke er beregnet til. Det er ikke
meningen at man skal stoppe alle de ting, der ligger fremme på
skriveborden ned i sessionsobjektet, blot for at overføre det fra side
til side. Det tager for mange ressourcer.

> [en masse PHP- og HTML-kode ...]
>
> if (isset($vis)) {
>    foreach ($_SESSION['filecontent'] as $dataline) {
>       list ($nam,$mal,$yea,$brn,$liv,$zip,$hmp)=explode('!',$dataline);
>       if ($name>'' ...
>       if ($year>'' ...
>       if ($born>'' ...
>       if ($zipc>'' ...
>       if ($live>'' ...
>       $show=true;
> osv.
> }
> ?>

Jeg foreslår at du gemmer nogle heltal, der indikerer hvor i filen, du
er nået til. Så må du åbne filen hver gang, du skal vise en ny side. Det
er sådan man plejer at gøre.

> Jeg havde en tidligere version af programmet hvor jeg brugte
> samme metode, og jeg mente selv at jeg fik det til at virke, men
> da jeg skulle tjekke det i forbindelse med revisionen, virkede
> det heller ikke.

Det kan være fordi at du bruger en webserver, hvor php er konfigureret
til at afsætte mindre plads til hver session.

> Måske skal jeg bare læse mere om sessions, men måske er der en
> der lige kan komme med det rigtige indspark?

Det er det rigtige indspark. Læs om sessions

F. eks. kan session.use_only_cookies ødelægge det for dig, for så skal
php sende hele filen til klienten i en cookie. Det går nok galt.

http://dk.php.net/manual/en/ref.session.php

(Der er et hav af kommentarer, som muligvis kan bruges.)

Ellers vil jeg opfordre dig til at prøve disse ting:

- Mindre filer (som nævnt ovenfor)
- Stop samme data i sessionsobjektet, men lad være med at hente det
fra en fil.

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
Visit my home page at http://michael.zedeler.dk/
Get my vcard at http://michael.zedeler.dk/vcard.vcf

Bertel Lund Hansen (08-04-2006)
Kommentar
Fra : Bertel Lund Hansen


Dato : 08-04-06 16:33

Michael Zedeler skrev:

> Jeg foreslår at du gemmer nogle heltal, der indikerer hvor i filen, du
> er nået til. Så må du åbne filen hver gang, du skal vise en ny side. Det
> er sådan man plejer at gøre.

Så gør jeg det. Tak for hjælpen.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Michael Zedeler (08-04-2006)
Kommentar
Fra : Michael Zedeler


Dato : 08-04-06 18:38

Bertel Lund Hansen wrote:
> Michael Zedeler skrev:
>
>>Jeg foreslår at du gemmer nogle heltal, der indikerer hvor i filen, du
>>er nået til. Så må du åbne filen hver gang, du skal vise en ny side. Det
>>er sådan man plejer at gøre.
>
> Så gør jeg det. Tak for hjælpen.

Hvis det bliver meget langsomt fordi du skal spole igennem filen, kan du
bruge fseek til hurtigt at spole frem og tilbage. (ftell giver dig
positionen i filen, du er nået til.)

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
Visit my home page at http://michael.zedeler.dk/
Get my vcard at http://michael.zedeler.dk/vcard.vcf

Bertel Lund Hansen (08-04-2006)
Kommentar
Fra : Bertel Lund Hansen


Dato : 08-04-06 20:04

Michael Zedeler skrev:

> Hvis det bliver meget langsomt fordi du skal spole igennem filen, kan du
> bruge fseek til hurtigt at spole frem og tilbage. (ftell giver dig
> positionen i filen, du er nået til.)

Filen er ikke så stor - og fseek() hjælper ikke. Siden kalder sig
selv hver gang og det kvadrer vel 'erindringen' om filstatus.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Michael Zedeler (09-04-2006)
Kommentar
Fra : Michael Zedeler


Dato : 09-04-06 00:46

Bertel Lund Hansen wrote:
> Michael Zedeler skrev:
>
>>Hvis det bliver meget langsomt fordi du skal spole igennem filen, kan du
>>bruge fseek til hurtigt at spole frem og tilbage. (ftell giver dig
>>positionen i filen, du er nået til.)
>
> Filen er ikke så stor - og fseek() hjælper ikke. Siden kalder sig
> selv hver gang og det kvadrer vel 'erindringen' om filstatus.

Ideen er at første gang scriptet kaldes, læser du i filen og bruger
ftell for at finde ud af hvilken position, du nåede til. Den værdi kan
du så stoppe i session-objektet.

På næste side bruger du så fseek til at spole frem med værdien fra
session-objektet.

Gentag efter behov.

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
Visit my home page at http://michael.zedeler.dk/
Get my vcard at http://michael.zedeler.dk/vcard.vcf

Bertel Lund Hansen (09-04-2006)
Kommentar
Fra : Bertel Lund Hansen


Dato : 09-04-06 07:37

Michael Zedeler skrev:

> Ideen er at første gang scriptet kaldes, læser du i filen og bruger
> ftell for at finde ud af hvilken position, du nåede til. Den værdi kan
> du så stoppe i session-objektet.

Åh ja. Vil det spare noget synderligt (ud over hukommelse)
sammenlignet med at jeg nu henter filen i ét hug? Ideen med
sessionen var jo at jeg kun skulle læse i filen én gang.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Michael Zedeler (09-04-2006)
Kommentar
Fra : Michael Zedeler


Dato : 09-04-06 09:15

Bertel Lund Hansen wrote:
> Michael Zedeler skrev:
>
>
>>Ideen er at første gang scriptet kaldes, læser du i filen og bruger
>>ftell for at finde ud af hvilken position, du nåede til. Den værdi kan
>>du så stoppe i session-objektet.
>
> Åh ja. Vil det spare noget synderligt (ud over hukommelse)
> sammenlignet med at jeg nu henter filen i ét hug?

Det kommer helt an på filens størrelse. Hvis den eer nogle få kilobytes,
ville jeg ikke bekymre mig.

> Ideen med
> sessionen var jo at jeg kun skulle læse i filen én gang.

Mnjaeh. Selv data på få kilo er efter min mening ikke noget man stopper
i et sessionsobjekt. Det er muligt at du kan få det til at virke, men
jeg ville ikke være rigtig glad for idéen. Iøvrigt ser det ud til at PHP
blot putter hele sessionen i en fil og genindlæser den når brugeren
åbner den følgende side. Jeg ved ikke om det er en indstilling man kan
ændre på, eller ej. I hvert fald betyder det at der er flere
overvejelser, man kan tage ind over.

Men har du fået det til at virke med at indlæse hele filen?

Bemærkede du at der på session-manualsiden på php.net netop står en
brugerkommentar om at man åbenbart ikke kan putte arrays i
sessionsobjektet? Jeg synes at det virker temmelig mærkeligt, hvis det
skulle være tilfældet.

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
Visit my home page at http://michael.zedeler.dk/
Get my vcard at http://michael.zedeler.dk/vcard.vcf

Bertel Lund Hansen (09-04-2006)
Kommentar
Fra : Bertel Lund Hansen


Dato : 09-04-06 10:09

Michael Zedeler skrev:

> jeg ville ikke være rigtig glad for idéen. Iøvrigt ser det ud
> til at PHP blot putter hele sessionen i en fil og genindlæser
> den når brugeren åbner den følgende side.

Så ville der jo ikke være sparet noget, og så kan det være det
samme.

> Men har du fået det til at virke med at indlæse hele filen?

Ja, og sådan bliver jeg nødt til at lave det. Man kan nemlig
bestille sortering på flere felter, og derfor kan jeg ikke bare
læse sekventielt.

> Bemærkede du at der på session-manualsiden på php.net netop
> står en brugerkommentar om at man åbenbart ikke kan putte
> arrays i sessionsobjektet?

Næ.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Michael Zedeler (09-04-2006)
Kommentar
Fra : Michael Zedeler


Dato : 09-04-06 12:28

Bertel Lund Hansen wrote:
> Michael Zedeler skrev:
>
>>jeg ville ikke være rigtig glad for idéen. Iøvrigt ser det ud
>>til at PHP blot putter hele sessionen i en fil og genindlæser
>>den når brugeren åbner den følgende side.
>
> Så ville der jo ikke være sparet noget, og så kan det være det
> samme.

Ikke nødvendigvis. Sekventiel søgning i store filer er meget dyrt, så
man kunne godt forestille sig nogle situationer, hvor man ville prøve at
cache et eller andet.

>>Men har du fået det til at virke med at indlæse hele filen?
>
> Ja, og sådan bliver jeg nødt til at lave det. Man kan nemlig
> bestille sortering på flere felter, og derfor kan jeg ikke bare
> læse sekventielt.

Okay.

>>Bemærkede du at der på session-manualsiden på php.net netop
>>står en brugerkommentar om at man åbenbart ikke kan putte
>>arrays i sessionsobjektet?
>
> Næ.

Jeg synes også at kommentaren er ret besynderlig. Det bør virke.

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
Visit my home page at http://michael.zedeler.dk/
Get my vcard at http://michael.zedeler.dk/vcard.vcf

Geert Lund (09-04-2006)
Kommentar
Fra : Geert Lund


Dato : 09-04-06 16:40

Michael Zedeler wrote:

> Bemærkede du at der på session-manualsiden på php.net netop står en
> brugerkommentar om at man åbenbart ikke kan putte arrays i
> sessionsobjektet? Jeg synes at det virker temmelig mærkeligt, hvis det
> skulle være tilfældet.

Selvfølgelig kan du gemme arrays i dit sessions-objekt.

Sessionen kan i øvrigt også ændre til at fx læses fra en database i
stedet for en fil i fil-systemet.

--
Med venlig hilsen
Geert Lund,
www.GLD.dk

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste