cheops: semaphoren und shared memory....

hallo zusammen!

kennt sich jemand von euch gut mit shared memory unter php aus?
ich hab eine klasse, die den speicher anlegen, daten schreiben und daten lesen können soll:

class userlogic
{
 var $skey;
 var $mkey;

function create_memory()
 {
  if (! ($mkey = shm_attach(0xff3,65536,OctDec("666"))))
   { echo "shmem_attach fehlgeschlagen<br>\n";}
  else
   $this->mkey = $mkey;
 }

function get_semaphore()
 {
  if(! ($skey = sem_get(0xff3,1024,0666 | IPC_CREAT)))
   { echo "sem_get fehlgeschlagen<br>\n";}
  else
   $this->skey = $skey;
  if(! sem_acquire($this->skey))
   { echo "sem_acquire fehlgeschlagen<br>\n";}
 }

function put_var($var)
 {
  shm_put_var($this->mkey,1,$var);
 }

function get_var()
 {
  $var = @shm_get_var($this->mkey,1);
  return $var;
 }

function release_semaphore()
 {
  sem_release($this->skey);
 }

function release_memory()
 {
  shm_remove ($mkey);
 }
}

zugriff erfolgt so:

$user_class = new userlogic;
$user_class->create_memory();
$user_class->put_var("dummy");
$user_class->release_semaphore();

prinzipiell funktioniert das ganz auch sehr gut, ABER dann und wann scheint was zu hängen und das script liefert kein feedback. es passiert einfach gar nix.... teilweise wird dann nach minuten (!) das erreicht, was passieren soll aber teilweise auch nicht.
mir ist völlig unschlüssig, woran es liegt, weil wenn es erstmal läuft, dann ist alles perfekt und es gibt keinen grund zur kritik.
wenn die daten geschrieben/gelesen wurden, stimmen sie auch überein, es geht also nichts verloren oder so.
ich vermute, dass irgendwas mit den semaphoren falsch ist im code, aber ich weiss nicht was...

hat jemand einen tip für mich?
vielen dank im voraus!!

gruß
marcus

  1. Hi,

    if (! ($mkey = shm_attach(0xff3,65536,OctDec("666"))))

    prinzipiell funktioniert das ganz auch sehr gut, ABER dann und wann scheint was zu hängen und das script liefert kein feedback. es passiert einfach gar nix.... teilweise wird dann nach minuten (!) das erreicht, was passieren soll aber teilweise auch nicht.

    Du hast einen fxen Key. Kann sein, das der Thread auf eine Möglichkeit wartet, den Key nutzen zu können. Das mag passieren oder auch nicht. Probiere mal einen dynamischen Key.

    so short

    Christoph Zurnieden

  2. mal abgesehen davon, für was man bei php scripten semaphoren braucht, wenn das script eh in ein paar millisekunden weg ist.
    um das script quasi mehrfach gleichzeitig auszuführen, mußt du ja eine ganz schön frequentierte seite haben.

    class userlogic
    {
    var $skey;

    was ist der default oder ungültige wert ?

    var $mkey;

    function create_memory()
    {
      if (! ($mkey = shm_attach(0xff3,65536,OctDec("666"))))

    warum nicht gleich: $this->mkey = shm_atta..

    { echo "shmem_attach fehlgeschlagen<br>\n";}

    welchen wert hat $this->mkey hier ??

    else
       $this->mkey = $mkey;
    }

    function get_semaphore()
    {
      if(! ($skey = sem_get(0xff3,1024,0666 | IPC_CREAT)))
       { echo "sem_get fehlgeschlagen<br>\n";}
      else
       $this->skey = $skey;
      if(! sem_acquire($this->skey))
       { echo "sem_acquire fehlgeschlagen<br>\n";}
    }

    function put_var($var)
    {
      shm_put_var($this->mkey,1,$var);
    }

    function get_var()
    {
      $var = @shm_get_var($this->mkey,1);
      return $var;
    }

    function release_semaphore()
    {
      sem_release($this->skey);
    }

    function release_memory()
    {
      shm_remove ($mkey);
    }
    }

    zugriff erfolgt so:

    $user_class = new userlogic;

    wo bleibt die fehlerbehandlung ?

    $user_class->create_memory();

    wo bleibt die fehlerbehandlung ?

    $user_class->put_var("dummy");

    wo bleibt die fehlerbehandlung ?

    $user_class->release_semaphore();

    hat jemand einen tip für mich?
    vielen dank im voraus!!

    du gehst immer davon aus, daß die vorhergehende operation erfolgreich war. was passiert aber, wenn diese einen fehler hatte?