Toon posts:

[php] shared memory

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik probeer shared memory uit te lezen via php op mijn server thuis. Ik gebruik apache 1.3.22 en php-4.1.2.

Dit is de structure in C die in het shm aanwezig is:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct btmp
{
  char      username[USERNAME_SIZE+1]; /* user's name          */
  char      hostname[HOSTNAME_SIZE+1]; /* user's hostname        */
  char      tty[7];          /* user's tty           */
  char      doing[DOING_SIZE+1];    /* user's doing          */
  char      curr_room[ROOMNAME_SIZE+1]; /* room the user is in now  */
  char      xdisreason[61];    /*                   */
  long      usernum;            /* user's usernumber        */
  long      logintime;        /* user's logintime        */
  long      idletime;          /* user's idlestarttime     */
  unsigned long priv;            /* user's priv.             */
  int        pid;             /* user's PID          */
  int        x_shm;         /* X-shmem slot #          */
  long      Xing;            /* Usernum of user i'm xing now */
  unsigned int  timescalled;        /* number of logins      */
  unsigned int  chat;            /* number of chatchamber     */
  unsigned long flags;          /* different flags: B_*    */
};

Als ik nu middels de volgende php code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<html>
<head>
<title>wholist</title>
</head>
<body>
<?
if($shm_id = shmop_open ( 200, "a", 0664, 22576)) 
 {    
    $wholething = shmop_read ( $shm_id, 0, shmop_size($shm_id));    
    echo "<pre>$wholething</pre>";    
    shmop_close ($shm_id);  
  }
else  
  {     
    echo "Get shared wholist space!<br>";  
  }   
?>
</body>
</html>

dan krijg ik het volgende in mijn browser:
code:
1
FastEddyeat *jammittyp0bProbably coding.....Lobby^ÄøArachnoseat *bd-c-3086.mxs.adsl.ttyp3 Lobby^±<Ò±<`?À

Hoe krijg ik nu de output normaal? Dus de chars als chars en de longs als nummer?
Ik dacht het op te lossen via de manier die ik in C gebruik, maar die maak gebruik van de struct lengte en die bestaat niet in php.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12-09 21:31

Janoz

Moderator Devschuur®

!litemod

Het makkelijkst lijkt mij om in je C gedeelte je data wat bruikbaarder in het shared memory gedeelte te zetten. Je zult je data toch een keer van het ene formaat in het andere formaat moeten krijgen. Dit kun je in C of in php doen. Mijn voorkeur gaat uit naar C (aangezien dat een stuk sneller is dan php). Je zouy kunnen kijken wat php doet waneer je een object/array serialized, en proberen dit in C te doen. Waneer je dan zo'n string in het geheugen zet, kun je dit met php uitlezen en gewoon unserialize() op aanroepen.

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


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Als een variant op het shm geknoei zou je een tmpfs kunnen gebruiken, tenminste als je linux gebruikt :)

Dat is een filesysteem, dynamisch van grootte etc in het ramgeheugen.
Voordeel is dat je gewoon allerlei simpele file functies kan toepassen en ook nooit "shm leak's" hebt... (rm -rf /mnt/tmpfs/* en je geheugen is gegarandeerd opgeschoond ;) )