[PHP] Alle sessies naar een MySQL DB ipv de standaard files

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Anoniem: 149075

Topicstarter
Ik ben aan het uitzoeken of ik alle php sessies die gegenereerd worden door de session-handler van PHP zelf kan opslaan in MySQL. Dit lijkt echt niet zo makkelijk, of ik ben het spoor bijster. 8)7

Even bot gezegd, je kunt voor een eigen script een eigen session-handler gebruiken die de sessie opslaat in PHP, dit heb ik wel eerder gebruikt en werkt gwoon goed. Er zijn verschillende applicaties die dit standaard al hebben, maar ook applicaties die de session-handeler van PHP zelf gebruiken. Voor de applicaties die deze "standaad" session handler gebruiken wil ik graag de mogelijkheid hebben om de sessies ook in een DB te zetten.

- Uiteraard heb ik dit op php.net gevolgd: http://www.php.net/manual...sion-set-save-handler.php
- Legio tuts opgezocht die toch altijd weer verwijzen naar een eigen gebouwde app waar je dit voor wil gebruiken.
- IRC geraadpleegd

Toch kom ik er niet uit hoe ik de "normale" session.handeler voor files om ga lijden, of porten naar een MySQL DB.

Het is volgens mij mogelijk zonder in ieder script je MySQL-session handler te includen aan de start van het script. Je zou met "auto_prepend_file" in de php.ini dit script standaard moeten kunnen "includen" in ieder PHP script, helaas begreep ik dit vannacht om 5 uur niet meer O-)

De vraag blijft dus:

Doe ik iets verkeerd, snap ik het niet of niet mogelijk ? Scheelt me wat nachtrust vandaag ;)

Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Waarschijnlijk is een auto_preprend_file inderdaad de manier om dit te doen. Er is ook nog wel een configuratieoptie:
session.save_handler defines the name of the handler which is used for storing and retrieving data associated with a session. Defaults to files. See also session_set_save_handler().
Maar waar die waardes vandaan komen of wat ze precies doen is niet zo duidelijk :)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

Anoniem: 149075

Topicstarter
Spider.007 schreef op zaterdag 18 maart 2006 @ 14:36:
Maar waar die waardes vandaan komen of wat ze precies doen is niet zo duidelijk :)
Dit meen je echt ? Ik kom hier namelijk ook echt niet uit :)

Net alsof ze uit de lucht komen vallen... Ik kan dus wel een script maken/zoeken dat sessies in de DB wil zetten, wie zegt dat PHP dat script ook weer gaat gebruiken om de sessie te controleren ?

[ Voor 21% gewijzigd door Anoniem: 149075 op 18-03-2006 14:40 ]


Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Anoniem: 149075 schreef op zaterdag 18 maart 2006 @ 14:38:
[...]

Dit meen je echt ? Ik kom hier namelijk ook echt niet uit :)

Net alsof ze uit de lucht komen vallen... Ik kan dus wel een script maken/zoeken dat sessies in de DB wil zetten, wie zegt dat PHP dat script ook weer gaat gebruiken om de sessie te controleren ?
Als je in je PHP Info kijkt zie je een optie 'Registered save handlers' staan. Daar staan de geregistreerde save-handlers.

Zie ook deze link

[ Voor 8% gewijzigd door Spider.007 op 18-03-2006 14:44 ]

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

Anoniem: 149075

Topicstarter
OK, duidelijk, dit helpt al een hele boel !

Echter kom ik er weer aan het einde van het artikel tot de conclusie dat dit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?
INCLUDE("mysql_sessions.inc");

session_set_save_handler("mysql_session_open", "mysql_session_close", 
  "mysql_session_select", "mysql_session_write", 
  "mysql_session_destroy",
  "mysql_session_garbage_collect");

session_start();

// At this point, sessions can be used just as they were in the 
// previous article!

?>


Aan het begin van ieder script moet komen te staan (of je applicatie).

Of zit ik hier nu volledig naast ? Ik mis een link denk ik.

Acties:
  • 0 Henk 'm!

Anoniem: 149075

Topicstarter
Ik ga toch neigen naar NFS, hoewel dit echt vreselijk overdone is. Sessies naar files is voor bestaande appliaties gewoon vele malen makkelijker.

Hoofdbrekens :9

Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Zou je je laatste bericht willen aanpassen als je binnen 24 uur nog iets hebt toe te voegen aan je post? Verder zie ik niet hoe je NFS wil gebruiken als vervanger voor sessie-opslag in je database? Zijn je applicaties dusdanig inefficient dat je door je schijfruimte heen bent?

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

Anoniem: 149075

Topicstarter
Ik zal hem volgende keer aanpassen, excuus O-)

NFS, kunnen meerdere systemen op mounten dus kan ik zonder MySQL-replicatie gedoe van beide machines de sessie openen wanneer iemand van systeem wisselt. (loadbalancing)

Het viel me overigens op dat een applicatie als phpMyAdmin geen problemen heeft met wisselen wanneer op systeem 2 de sessie niet bestaat.

Ik denk dat openasf ook wel een goed idee kan zijn hier, alleen nog niet stabiel genoeg.

[ Voor 21% gewijzigd door Anoniem: 149075 op 19-03-2006 15:19 ]


Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Anoniem: 149075 schreef op zondag 19 maart 2006 @ 15:18:
[...]

NFS, kunnen meerdere systemen op mounten dus kan ik zonder MySQL-replicatie gedoe van beide machines de sessie openen wanneer iemand van systeem wisselt. (loadbalancing)

[...]
Ah; al zet je dat nou meteen in je topicstart :D Maar wat is dan het probleem bij het gebruik van auto_prepend_file :?

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

Anoniem: 149075

Topicstarter
Spider.007 schreef op zondag 19 maart 2006 @ 15:23:
[...]

Ah; al zet je dat nou meteen in je topicstart :D Maar wat is dan het probleem bij het gebruik van auto_prepend_file :?
Ja, sorry, zat bij mij wel in mijn hoofd natuurlijk :D

Als ik met auto_prepend_file een sessie-handler aanroep gebeurt er niets of krijg ik foutmeldingen. Ik zet netjes de session-handler in php.ini op "user" maar ben bang dat ik een verkeerd script gebruik ofzo.

Die link van jou zou toch moeten werken lijkt me op deze manier toch ?

Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Anoniem: 149075 schreef op zondag 19 maart 2006 @ 15:36:
[...]

Die link van jou zou toch moeten werken lijkt me op deze manier toch ?
Dat was wel de bedoeling en lijkt me ook wel te moeten werken. Wat voor foutmelding krijg je dan?

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

Anoniem: 149075

Topicstarter
Spider.007 schreef op zondag 19 maart 2006 @ 16:01:
[...]

Dat was wel de bedoeling en lijkt me ook wel te moeten werken. Wat voor foutmelding krijg je dan?
Hè, ik ben er "teveel" mee bezig, maar wat ik gedaan heb:

- function voor de mysql_* zaken gezet. (dat was dus de error die ik overigens al op op had gelost... het "hè" verhaal hierboven |:( )

- Het script hieronder "mysql_sessions.inc" genoemd.

- Het scriptje hier een paar posts boven [rml]RutgerM in "[ PHP] Alle sessies naar een MySQL DB ipv..."[/rml] als handler.php genoemd en deze aangeroepen achter de "auto_prepend_file"

Lijkt me goed toch ?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
<?

// Session Table

$sess_table = "SessionsTable";

// Retrieve the session maximum lifetime (found in php.ini)

$lifetime = get_cfg_var("session.gc_maxlifetime");

//=============
// function: mysql_session_open()
// purpose: Opens a persistent server connection and selects the 
//    database.
//=============

function mysql_session_open($session_path, $session_name) {

  mysql_pconnect("localhost", "myusername", "mysecretpassword")
         or die("Can't connect to MySQL server! ");

  mysql_select_db("sessions_database")
         or die("Can't select MySQL sessions database");

} // end mysql_session_open()

//=============
// function: mysql_session_close()
// purpose: Doesn't actually do anything since the server connection is 
//    persistent. Keep in mind that although this function 
//    doesn't do anything in my particular implementation, I 
//    still must define it.
//=============

function mysql_session_close() {

  return 1;

} // end mysql_session_close()

//=============
// function: mysql_session_select()
// purpose: Reads the session data from the database
//=============

function mysql_session_select($SID) {

  GLOBAL $sess_db;
  GLOBAL $sess_table;

  $query = "SELECT value FROM $sess_table
      WHERE SID = '$SID' AND
      expiration > ". time();

  $result = mysql_query($query);

} // end mysql_session_select()

//=============
// function: mysql_session_write()
// purpose: This function writes the session data to the database. If that SID // already exists, then the existing data will be updated.
//=============

function mysql_session_write($SID, $value) {

  GLOBAL $sess_db;
  GLOBAL $sess_table;
  GLOBAL $lifetime;

  $expiration = time() + $lifetime;

  $query = "INSERT INTO $sess_table 
      VALUES('$SID', '$expiration', '$value')";

  $result = mysql_query($query, $sess_db);

  if (! $result) :

   $query = "UPDATE $sess_table SET 
       expiration = '$expiration',
       value = '$value' WHERE
       SID = '$SID' AND expiration >". time();

   $result = mysql_query($query, $sess_db);

  endif;

} // end mysql_session_write()

//=============
// function: mysql_session_destroy()
// purpose: deletes all session information having input SID (only one row)
//=============

finction mysql_session_destroy($sessionID) {

  GLOBAL $sess_table;

  $query = "DELETE FROM $sess_table 
      WHERE SID = '$sessionID'";
  $result = mysql_query($query);

} // end mysql_session_destroy()

//=============
// function: mysql_session_garbage_collect()
// purpose: deletes all sessions that have expired.
//=============

function mysql_session_garbage_collect($lifetime) {

  GLOBAL $sess_table;

  $query = "DELETE FROM $sess_table 
      WHERE sess_expiration < ".time() - $lifetime;
  $result = mysql_query($query);

  return mysql_affected_rows($result);

} // end mysql_session_garbage_collect()

?>

Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Ik verplaats je topic even aangezien dit meer een programmeerprobleem begint te worden :)

SA > PW

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

  • EdwinV
  • Registratie: Januari 2004
  • Laatst online: 18-04 15:08
Anoniem: 149075 schreef op zondag 19 maart 2006 @ 16:38:
[...]


Hè, ik ben er "teveel" mee bezig, maar wat ik gedaan heb:

- function voor de mysql_* zaken gezet. (dat was dus de error die ik overigens al op op had gelost... het "hè" verhaal hierboven |:( )

- Het script hieronder "mysql_sessions.inc" genoemd.

- Het scriptje hier een paar posts boven [rml]RutgerM in "[ PHP] Alle sessies naar een MySQL DB ipv..."[/rml] als handler.php genoemd en deze aangeroepen achter de "auto_prepend_file"

Lijkt me goed toch ?

...
toon volledige bericht
Er zitten echter nog wel wat fouten in de code. Regelmatig zoek jij de global $sess_db, terwijl die variabele nergens bestaat. Op willekeurige plaatsen gebruik je dit als connection resource bij je mysql_query aanroepen.

Misschien kan je aangeven wat er precies fout gaat? Krijg je foutmeldingen?

[ Voor 5% gewijzigd door EdwinV op 19-03-2006 17:11 ]


Acties:
  • 0 Henk 'm!

Anoniem: 149075

Topicstarter
Flydesign.nl schreef op zondag 19 maart 2006 @ 17:11:
[...]


Er zitten echter nog wel wat fouten in de code. Regelmatig zoek jij de global $sess_db, terwijl die variabele nergens bestaat. Op willekeurige plaatsen gebruik je dit als connection resource bij je mysql_query aanroepen.

Misschien kan je aangeven wat er precies fout gaat? Krijg je foutmeldingen?
Ik ben/ga de $sess_db even verder bestuderen, maar op dit moment wordt er gewoon niets weggeschreven in de DB, ook niets in de logs te vinden.

Acties:
  • 0 Henk 'm!

  • iH8
  • Registratie: December 2001
  • Laatst online: 17-06-2024

iH8

Flydesign.nl schreef op zondag 19 maart 2006 @ 17:11:
[...]

Er zitten echter nog wel wat fouten in de code.
ik spotte ook een finction session destroy ;)

Aunt bunny is coming to get me!


Acties:
  • 0 Henk 'm!

Anoniem: 149075

Topicstarter
iH8 schreef op zondag 19 maart 2006 @ 19:39:
[...]


ik spotte ook een finction session destroy ;)
Dat kwam omdat ik het er in dit topic net even ingetypt had... werd net wakker :+

Acties:
  • 0 Henk 'm!

  • EdwinV
  • Registratie: Januari 2004
  • Laatst online: 18-04 15:08
Anoniem: 149075 schreef op zondag 19 maart 2006 @ 19:31:
[...]


Ik ben/ga de $sess_db even verder bestuderen, maar op dit moment wordt er gewoon niets weggeschreven in de DB, ook niets in de logs te vinden.
Zonder degelijke foutafhankelijk voor MySQL kan je natuurlijk ook niets zeggen over het slagen van de queries. Als de query een foutmelding terug geeft zal je deze eerst moeten uitlezen middels mysql_error.

Acties:
  • 0 Henk 'm!

  • DPLuS
  • Registratie: April 2000
  • Niet online

DPLuS

 

Anders moet je eens naar deze klasse kijken:
http://freshmeat.net/projects/db_esession/

Ik gebruik hem al een tijdje naar volle tevredenheid.
Er zit een duidelijke handleiding voor je bij....
Pagina: 1