[PHP] Persistent OCI per sessie

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voor een web applicatie ben ik op zoek naar een manier om "persistent connections" naar een oracle database kan opzetten. Het is de bedoeling dat de connectie in de sessie bewaard blijft. Zodat elke gebruiker altijd 1 verbinding heeft.
Het openen van een connectie met OCIPLogon(...) lukt, maar hoe sla ik die verbinding in de sessie op? Of is het niet mogelijk om deze verbinding op te slaan in de sessie? Zo nee, is het wel mogelijk om een OCINLogon(...) of een OCILogon(...) op te slaan?

Dit is de code van m'n script:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?
include('config.inc.php');

session_start();

// Create connection
if(isset($_SESSION['connection'])) {
   $conn = $_SESSION['connection'];
}else{
   $conn = OCILogon(DB_USERNAME,DB_PASSWORD,DB_NAME);
   $_SESSION['connnection'] = $conn;
}

// Execute
$cursor = OCIParse($conn,"UPDATE items SET item_name='PHP' WHERE item_id=300");
OCIExecute($cursor,OCI_DEFAULT);
?>

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Volgens mij is dit iets dat gewoon niet kan met php, tenzij je een of andere "hou de php-variabele hier actief"-daemon opzoekt (ik weet dat er een is, maar weet niet meer hoe ie heet :P ) waar je op basis van een sessie-id dan je connectie weer uit terug kan zoeken.

plogon's worden over het algemeen per apache-child actief gehouden, niet zoals in Java een algemeen toegankelijke groep van connecties die eventueel aan een sessie te koppelen is.

Waarom wil je het trouwens aan je sessie binden? Een druk bezochte site heeft veel meer actieve sessies dan actieve connecties...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ACM schreef op 31 januari 2003 @ 13:37:
Waarom wil je het trouwens aan je sessie binden? Een druk bezochte site heeft veel meer actieve sessies dan actieve connecties...
Wat ik aan het maken ben, dat is een systeem waar meerdere gebruikers tegelijkertijd verschillende onderdelen in de site moeten kunnen wijzigen, verwijderen, enz.. Door met oracle transactions te werken probeer ik de records in de database waar een gebruiker mee bezig is te locken. Zodat niemand anders deze kan wijzigen. (Dit om te voorkomen dat mensen tegelijkertijd een item gaan lopen wijzigen, verwijderen :))

Hmm... dat php hier zelf niets voor heeft vind ik wel erg raar eigenlijk. Want het maken een bepaalde "wizard" van meerdere schermen in je applicatie wordt je zo wel erg moeilijk gemaakt :(

Acties:
  • 0 Henk 'm!

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 07-11-2023

kvdveer

Z.O.Z.

Verwijderd schreef op 31 January 2003 @ 13:46:
[...]

Wat ik aan het maken ben, dat is een systeem waar meerdere gebruikers tegelijkertijd verschillende onderdelen in de site moeten kunnen wijzigen, verwijderen, enz.. Door met oracle transactions te werken probeer ik de records in de database waar een gebruiker mee bezig is te locken. Zodat niemand anders deze kan wijzigen. (Dit om te voorkomen dat mensen tegelijkertijd een item gaan lopen wijzigen, verwijderen :))

Hmm... dat php hier zelf niets voor heeft vind ik wel erg raar eigenlijk. Want het maken een bepaalde "wizard" van meerdere schermen in je applicatie wordt je zo wel erg moeilijk gemaakt :(
Ik gebruik zelf de PHP-locking functies op lockfiles voor zo'n doeleinde. Niet bepaald charmant, maar het werkt. In die lockfile sla ik overigens ook nog de uid van de gebruiker op zodat we problemen achteraf kunnen achterhalen. Maar transacties kunnen op die manier natuurlijk niet.

Localhost, sweet localhost


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
kvdveer schreef op 31 januari 2003 @ 13:50:
[...]


Ik gebruik zelf de PHP-locking functies op lockfiles voor zo'n doeleinde. Niet bepaald charmant, maar het werkt. In die lockfile sla ik overigens ook nog de uid van de gebruiker op zodat we problemen achteraf kunnen achterhalen. Maar transacties kunnen op die manier natuurlijk niet.
Aha, dat klinkt wel goed :)
Ik neem aan dat je met "PHP-locking functies" bedoelt dat je met een sql query zelf ook een record kunt locken? Standaard php functies hiervoorkan ik namelijk niet vinden.

Of houd je zelf een file bij met daarin informatie over locks? (Hier heb ik ook geen standaard functies voor kunnen vinden :))

Acties:
  • 0 Henk 'm!

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 07-11-2023

kvdveer

Z.O.Z.

Verwijderd schreef op 31 januari 2003 @ 14:05:
[...]

Aha, dat klinkt wel goed :)
Ik neem aan dat je met "PHP-locking functies" bedoelt dat je met een sql query zelf ook een record kunt locken? Standaard php functies hiervoorkan ik namelijk niet vinden.

Of houd je zelf een file bij met daarin informatie over locks? (Hier heb ik ook geen standaard functies voor kunnen vinden :))
Zoek eens naar flock(). Met deze functie kun je een bestand locken, zodat een ander php proces er niet naar kan lezen en/of schrijven. Door het aanmaken en locken van zo'n bestandje kun je locks verkrijgen. 99.9% safe in tegenstelling tot andere technieken. Het is wel vrij performancegevoelig, dus je moet het niet te pas en te onpas gaan gebruiken.

Een gestripte versie van mijn aquirelock:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function aquirelock($name,$timout,$userid) {
// check $name op ongeldige karakters
    global $lockdir, $locks;
    if(file_exists($lockdir.$name)) return false;
    $fp = @fopen($lockdir.$name,"w+");
    if(!$fp) {
        $log->add('lock','...');
        return false;
    }
    if(flock($fp, LOCK_EX,false)) {
        // schrijf bestand. SLUIT HET NIET!
        usleep(10000); (slaap 10 ms, om race problemen te voorkomen)
        return true;
    }
    else {
        // lees het bestand uit, controleer de timout en zo.
    }
    fclose($fp);
    return false;
}

Het gekozen bestand blijft gelockt tot het einde van het script. Die flock wordt alleen gebruikt om race-condities bij het verkrijgen van het lock te voorkomen. Een aanwezig bestand betekent dat het lock er is.

[ Voor 3% gewijzigd door kvdveer op 31-01-2003 14:22 ]

Localhost, sweet localhost


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat is een mooie manier ja, maar ik ga het oplossen door zelf een lockedbyuser veld aan de tabel toe te voegen. Dat lijkt me (iets) :) sneller qua performance. Maar iig heel erg bedankt voor de tip.
Pagina: 1