[PHP] gegevens uitwisseling tussen scripts met shmop

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Consequator
  • Registratie: Juli 2000
  • Laatst online: 10-09 22:54
Ik probeer iets op te zetten zodat ik makkelijk (zonder database) een array met data kan uitwisselen tussen verschillende lopende scripts.
Na wat speurwerk kwam ik uit bij de 'shmop' functies van php, als experiment heb ik hiervoor de onderstaande functie gemaakt.
Het probleem waar ik echter tegenaan loop is dat de oude data niet wordt verwijderd.
Zoals hier onder al te zien is heb ik al een aantal dingen lopen proberen, waaronder even wachten na het verwijderen en om in elk block een spatie te schrijven, maar om voor mij nog onduidelijke redenen blijft hij oude data bewaren dat in dit geheugen blok staat.
Iemand enig idee wat ik fout doe, of een andere suggestie om data uit te wisselen tussen verschillende scripts ?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function DoShmop() {
       global $shmid;
       shmop_delete($shmid);
       shmop_close($shmid);
       usleep(500);
       $shmid = shmop_open(100,"n",0644,102400);
       $erase = 0;
       $count = 0;
       while($erase !== FALSE) {
               $erase = @shmop_write($shmid," ",$count);
               $count++;
       }
       $size = shmop_write($shmid,serialize($GLOBALS),0);
}


om het weer uit te lezen:
code:
1
2
3
4
5
<?php
        $shmid = shmop_open(100,"a",0666,20480);
        print_r(unserialize(shmop_read($shmid,0,shmop_size($shmid))));
        shmop_close($shmid);
?>


Het resultaat:
code:
1
2
3
4
5
6
7
8
9
Array
(
    [GLOBALS] => Array
        (
            [GLOBALS] => Array
                (
                    [GLOBALS] => 
etc etc...
}

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Waarom wil je perse geen database gebruiken? Het gebruik van shared memory komt over als een houtje-touwtje oplossing en is alles behalve betrouwbaar.

Acties:
  • 0 Henk 'm!

  • smesjz
  • Registratie: Juli 2002
  • Niet online
A helpful hint, although when using shmop on windows (yes you can use shmop on windows in IIS or Apache when used as isapi/module) you can delete a segment and later open a new segment with the SAME KEY in the same script no problem, YOU CANNOT IN LINUX/UNIX - the segment will still exist - it's not immediately deleted - but will be marked for deletion and you'll get errors when trying to create the new one - just a reminder.
Commentaar uit 2004 op php.net. Welke waarde heeft $shmid op het moment dat je DoShmop() aanroept? Ook 100?

In dat geval is het commentaar hierboven van toepassing zo te zien.

Acties:
  • 0 Henk 'm!

  • naam
  • Registratie: Oktober 2007
  • Laatst online: 12-09 13:07
Kan je niet de data serializen en dan naar een bestand wegschrijven?

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 08:51

Janoz

Moderator Devschuur®

!litemod

marabunta2048 schreef op woensdag 07 april 2010 @ 12:32:
Kan je niet de data serializen en dan naar een bestand wegschrijven?
Daarmee worden de raceproblemen alleen maar groter.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Is SQlite geen oplossing?

Acties:
  • 0 Henk 'm!

  • Consequator
  • Registratie: Juli 2000
  • Laatst online: 10-09 22:54
Omdat ik hem vrij vaak wil updaten had ik gehoopt hem in RAM te houden zodat hij niet constant in de mysql database loopt te schrijven, scheelt weer disk io. En aangezien het toch vluchtige data is.

De $shmid is alleen de identifier, die staat eigenlijk altijd op 0.

Met naar een bestand schrijven krijg je alleen het probleem dat hij nog net aan het schrijven is terwijl je probeert te lezen.

Ik krijg geen fouten met het opnieuw aanmaken van een segment, ik zou steeds een andere key kunnen pakken maar dan zit ik weer met 'hoe krijg ik die key bekend in het andere script zonder ergens iets op disk te schrijven.'

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Is het niet verstandiger dit soort optimalisaties gewoon aan MySQL zelf over te laten? Zo'n database is er voor gemaakt om veel dingen te lezen/schrijven.

Acties:
  • 0 Henk 'm!

  • Icekiller2k6
  • Registratie: Februari 2005
  • Laatst online: 20:21
Ik snap hem wel, ik heb zelf een 3GB grote db in het geheugen zitten, ik gebruik wel MSSQL..

Dus puur in het geheugen gooien gaat hoor incombinatie met mssql/mysql..
ook al is het vluchtig, je wilt voor welke reden dan ook kunnen opslaan en dan later verder gaan, of als je later satellieten gaat toevoegen dit kunnen doorgeven

MT Venus E 5KW (V151) P1 HomeWizard | Hackerspace Brixel te Hasselt (BE) - http://www.brixel.be | 9800X3D, 96GB DDR5 6000MHZ, NVIDIA GEFORCE 4090, ASRock X670E Steel Legend, Seasonic GX1000


Acties:
  • 0 Henk 'm!

  • Consequator
  • Registratie: Juli 2000
  • Laatst online: 10-09 22:54
Volgens mij gaat het inderdaad anders ook niet werken...
MySQL heeft wel een 'heap' table maar die kan geen text opslaan, tenminste, niet genoeg.

Dan toch maar een extra tabel er bij.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Kun je trouwens niet iets als APC gebruiken om alles in het geheugen te bewaren?

Acties:
  • 0 Henk 'm!

  • kwaakvaak_v2
  • Registratie: Juni 2009
  • Laatst online: 02-06 12:29
Consequator schreef op woensdag 07 april 2010 @ 13:13:
Omdat ik hem vrij vaak wil updaten had ik gehoopt hem in RAM te houden zodat hij niet constant in de mysql database loopt te schrijven, scheelt weer disk io. En aangezien het toch vluchtige data is.
Zelfs daar heeft mysql aan gedacht voor jou ;) de MEMORY storage engine doet precies wat je verwacht, het schrijft data in het gegeugen. Maar dan wel shared :)

Ik heb het een hele poos gebruikt/getest op een middel groot forum voor de sessie tabel, en werkt prima. Data blijft in het geheugen zolang mysqld loopt, stop je de server is de data weg. En ja, mysql kan verschillende storage engines per table gebruiken in 1 database.

Driving a cadillac in a fool's parade.


Acties:
  • 0 Henk 'm!

  • Consequator
  • Registratie: Juli 2000
  • Laatst online: 10-09 22:54
kwaakvaak_v2 schreef op donderdag 08 april 2010 @ 09:13:
[...]


Zelfs daar heeft mysql aan gedacht voor jou ;) de MEMORY storage engine doet precies wat je verwacht, het schrijft data in het gegeugen. Maar dan wel shared :)

Ik heb het een hele poos gebruikt/getest op een middel groot forum voor de sessie tabel, en werkt prima. Data blijft in het geheugen zolang mysqld loopt, stop je de server is de data weg. En ja, mysql kan verschillende storage engines per table gebruiken in 1 database.
Die kwam ik ook tegen, maar daar stond dat hij dan geen TEXT en BLOB velden ondersteund.
Stiekem toch wel dan ? Of had je er alleen maar integers in ?

Acties:
  • 0 Henk 'm!

  • Icekiller2k6
  • Registratie: Februari 2005
  • Laatst online: 20:21
Consequator schreef op donderdag 08 april 2010 @ 14:50:
[...]


Die kwam ik ook tegen, maar daar stond dat hij dan geen TEXT en BLOB velden ondersteund.
Stiekem toch wel dan ? Of had je er alleen maar integers in ?
als ik kwaak juist begrijp, maakt het niet uit.. 'tis het geheugen wat "wordt opgeslagen" en deze terug kunt zetten en zo weer aanspreken

MT Venus E 5KW (V151) P1 HomeWizard | Hackerspace Brixel te Hasselt (BE) - http://www.brixel.be | 9800X3D, 96GB DDR5 6000MHZ, NVIDIA GEFORCE 4090, ASRock X670E Steel Legend, Seasonic GX1000


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
HuHu schreef op donderdag 08 april 2010 @ 08:41:
Kun je trouwens niet iets als APC gebruiken om alles in het geheugen te bewaren?
Inderdaad, daar is t redelijk voor bedoeld. Of Memcached, komt ongeveer op t zelfde neer maar dan wat schaalbaarder.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 08:51

Janoz

Moderator Devschuur®

!litemod

Hmm, ik ben wel erg benieuwd welke data je eigenlijk op wilt gaan slaan wanneer je het liefst TEXT en/of BLOB in memory wilt houden.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • kwaakvaak_v2
  • Registratie: Juni 2009
  • Laatst online: 02-06 12:29
Consequator schreef op donderdag 08 april 2010 @ 14:50:
[...]


Die kwam ik ook tegen, maar daar stond dat hij dan geen TEXT en BLOB velden ondersteund.
Stiekem toch wel dan ? Of had je er alleen maar integers in ?
Varchar (255) zijn voor mij groot zat, meeste zijn toch int met referenties naar andere tabellen :)

Driving a cadillac in a fool's parade.

Pagina: 1