sla array op in een bestand

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Daniel van Seggelen

Daniel van Seggelen

07/12/2017 09:25:20
Quote Anchor link
Ik gebruik nu voor een multilanguage website een SESSION variabele die gegenereerd word uit database waardes.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
        $lang =  $_SESSION['lang'];    

        $def = array();
        $st = mysqli_query($DBD->conn(),"SELECT * from lang") or die (mysqli_error($DBD->conn()));        
          while ($s = mysqli_fetch_array($st))
          {

            $def[''.$s['def'].''] = trim($s['waarde_'.$lang.'']);
          }
          
          $_SESSION['def'] = $def;            


Hoe kan ik deze waardes opslaan en ophalen in een extern bestand? Dit wil ik doen om de snelheid te verbeteren
 
PHP hulp

PHP hulp

25/04/2024 09:29:55
 
Ward van der Put
Moderator

Ward van der Put

07/12/2017 09:27:59
Quote Anchor link
Een sessie wordt standaard al opgeslagen in een bestand. Het enige dat je daarom hoeft te doen, is deze query één keer uitvoeren bij het starten van de sessie.
 
Daniel van Seggelen

Daniel van Seggelen

07/12/2017 09:58:21
Quote Anchor link
Dat snap ik, maar ik zou graag willen dat dit bestand door de klant ook aangepast kan worden in een extern bestand.
Ik wil dus dat de sessies uit een extern bestand gelezen word.
 
- Ariën  -
Beheerder

- Ariën -

07/12/2017 10:16:23
Quote Anchor link
Je wilt liever niet Jan en Alleman in je sessiedirectory laten komen, want je maakt hier een groot veiligheidsrisico mee.

Je klant kan toch ook prima in de lang-table schrijven? Je kan wel weer wat maken wat de inhoud van die tabel cached, als je snelheidsperformance wilt halen.
Gewijzigd op 07/12/2017 10:18:11 door - Ariën -
 
Daniel van Seggelen

Daniel van Seggelen

07/12/2017 11:58:32
Quote Anchor link
Niet jan en Alleman, maar gewoon bepaalde mensen die toegang hebben tot de bestanden.
Ik lees dat language files altijd sneller zijn dat informatie uit de database halen. Dus dat is de voornaamste reden.
 
- Ariën  -
Beheerder

- Ariën -

07/12/2017 12:00:33
Quote Anchor link
En ook bepaalde mensen wil je niet toegang geven tot de session-dir. Wat als hun account gecompromitteerd wordt? De session-dir hoort boven je public_html te liggen, en niet anders. Dus laat die sessie lekker zoals het is, en laat de language-teksten lekker cachen in een apart bestand. Je zou het zelfs direct vanuit de database kunnen omzetten naar een JSON-format bijvoorbeeld.

Dan is het opslaan in de database alleen puur bedoeld als handigheid om er met regelmaat een nieuwe tekst aan toe te voegen, waarna je deze exporteert naar een bestand.
Gewijzigd op 07/12/2017 12:02:41 door - Ariën -
 
Nick Vledder

Nick Vledder

07/12/2017 14:16:38
Quote Anchor link
@Daniel

Ik kan me voorstellen dat je $_SESSION['lang'] een afkorting voor een taal bevat, bijvoorbeeld 'nl' of 'en' (resp. voor Nederlands en Engels). In de database zitten tekstfragmenten die te koppelen zijn/ een verwijzing hebben naar een taal. Jouw vraagstelling is ietwat vaag, maar ik kan me voorstellen dat je worstelt met het feit hoe $_SESSION['lang'] geset wordt (op basis waarvan).

Dit setten kun je doen aan het begin van de sessie op basis van... 'whatever'. Een language-parameter gekoppeld aan een user-tabel, een default, etc.

Daarnaast ben je vrij in het wijzigen gedurende een sessie, bijvoorbeeld een user die een andere taal uit een dropdown selecteert, de waarde van de $_SESSION['lang'] weer te wijzigen en vervolgens de teksten op de pagina te 'refreshen' in de gekozen taal. Deze keuze zou je in de 'user-tabel' kunnen vastleggen op basis waarvan in een nieuwe sessie weer de $_SESSION['lang'] wordt geset (cirkel is rond).

De uitgeschreven teksten zelf (in verschillende talen) zou ik in de database houden. Dit staat m.i. los van het feit dat je een pagina als geheel wel kunt besluiten te 'cachen' als bestand. Uiteraard rekening houdend met wijzigingen in bijvoorbeeld de tekstentabel(len).
Gewijzigd op 07/12/2017 14:24:36 door Nick Vledder
 
Thomas van den Heuvel

Thomas van den Heuvel

07/12/2017 18:21:48
Quote Anchor link
De topicstarter maakt twee dingen niet duidelijk:

1. Waarom de inhoud van de sessie gewijzigd zou moeten worden
Mogelijk is dit omdat deze informatie in eerste instantie opgeslagen wordt in de sessie, dat dit de noodzaak introduceert om deze vervolgens weer aan te passen in de sessie. In plaats hiervan zou je een taalkeuze (maar niet alle vertalingen lol) bijvoorbeeld op kunnen slaan in een User object, die elke page-access opnieuw berekend wordt (zoals doorgaans gebeurt met User objecten). Mogelijk introduceer je zelf het probleem door de informatie "sticky" te maken. Er is sowieso een heleboel voor te zeggen om bepaalde zaken on-the-fly te berekenen aan de hand van minimale sessie-informatie. En een bijkomend voordeel is dus dat je niet rechtstreeks in sessies aan het prutsen bent.

En ja, al dat gedoe met veiligheid. Je wilt simpelweg niet dat de inhoud van een sessie actief -en direct- gewijzigd kan worden door andere personen dan de "eigenaar" van de sessie. Als je dat wel wilt doen is dat gewoon een indicatie dat de informatie daar niet thuishoort.

2. Waarom de informatie (dus) uberhaupt in de sessie zou moeten staan
Als dit gaat om "dictionary entries": daar is een sessie niet de plaats voor. Een sessie is niet een rijdend archief. Wat je hoogstens opslaat in een sessie is een taalkeuze. In code schakel je op grond van deze taalkeuze naar specifieke vertalingen. Maar die zinsneden horen NIET in een sessie thuis.

Als het een taalkeuze betreft dan zou ik zeggen dat die minder "vluchtig" is dan de sessieduur. Je zou dus kunnen denken aan voorkeuren in een gebruikersprofiel (die via de sessie worden ingeladen in een User object die elke page-access wordt ververst) of simpelweg een cookie?

EDIT: de hele bovenstaande voorgestelde constructie lijkt mij inefficiënt. Zoals @Ward al aangaf: sessies worden al opgeslagen in bestanden. Deze bestanden worden ook niet altijd direct opgeschoond. Afhankelijk van het aantal gebruikers en de grootte van de "lang" tabel zou dit zelfs op een gegeven moment tot problemen kunnen leiden (diskruimte, lees- en schrijfacties et cetera).
Gewijzigd op 07/12/2017 18:25:54 door Thomas van den Heuvel
 
Rob Doemaarwat

Rob Doemaarwat

07/12/2017 21:39:12
Quote Anchor link
Zo te zien zijn de vertalingen niet gebruikersspecifiek. Je kunt ze dus voor alle gebruikers opslaan in een enkel bestand. Als je ze dan ook nog als PHP code op slaat (via var_export()) kun je ze met een include inlezen. Dat is leuk, maar het grote voordeel is dat ze dan in de opcode cache gaan, en supersnel beschikbaar zijn. Sneller dan variabelen in een sessie (of welke andere cache oplossing dan ook), want die moet eerst unserialized() worden.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
//lezen
$def = require($lang_file);

//opslaan
file_put_contents($lang_file,"<?php\nreturn " . var_export($def,true) . ";");
Gewijzigd op 07/12/2017 21:39:58 door Rob Doemaarwat
 
Daniel van Seggelen

Daniel van Seggelen

08/12/2017 17:19:52
Quote Anchor link
Bedankt voor alle antwoorden. Het laatste ga ik implementeren m.b.t. snelheid en veiligheid.
Dit zat ook al in mijn hoofd, alleen \n of \n\r maakt geen nieuwe regels aan in WAMP. Waar ligt dit aan? Wil het eerst offline testen namelijk
Gewijzigd op 08/12/2017 18:20:31 door Daniel van Seggelen
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.