shm_get_var

(PHP 4, PHP 5)

shm_get_varReturns a variable from shared memory

Description

mixed shm_get_var ( resource $shm_identifier , int $variable_key )

shm_get_var() returns the variable with a given variable_key, in the given shared memory segment. The variable is still present in the shared memory.

Parameters

shm_identifier

Shared memory segment, obtained from shm_attach().

variable_key

The variable key.

Return Values

Returns the variable with the given key.

See Also

Коментарии

Автор:
This seems to work fine to detect the lack of presence of a key in shared memory and then init it to 0 when found:

if(!defined(shm_get_var($mutex, $mutex_key))) {
        shm_put_var($mutex, $mutex_key, 0);
}
2005-02-18 02:05:17
http://php5.kiev.ua/manual/ru/function.shm-get-var.html
Автор:
You will still receive a notice use @:

if(!defined(@shm_get_var($mutex, $mutex_key))) {
       shm_put_var($mutex, $mutex_key, 0);
}
2005-05-06 05:01:57
http://php5.kiev.ua/manual/ru/function.shm-get-var.html
Автор:
To follow up on the posts by anonymous, Bob Van Zant and chris at free-source dot com below (or, as must people inexplicably write, above) regarding the PHP warning and FALSE that shm_get_var returns if the variable key doesn't exist:

My tests (with PHP4.3.4) show that defined() is useless here. Because the function defined(string) checks whether the constant whose name is string exists, the code 
<?php
if ( defined(@shm_get_var($mutex$mutex_key)) {
   ...
}
?>
acts the same ("..." does not get executed) whether the variable is defined or not--unless $mutex_key happens to identify a valid string that happens to be the name of a constant. :)

Rather,
<?php
if ( @shm_get_var($mutex$mutex_key) === FALSE ) {
   ...
}
?>
works, provided the object that was stored isn't actually FALSE (via <?php shm_put_var($mutex$mutex_keyFALSE); ?>)

It would be nice to have a completely air-tight solution, though.  D'oh!
2005-05-14 18:50:17
http://php5.kiev.ua/manual/ru/function.shm-get-var.html
A fully functional sample  ...

<?php
echo "<PRE>\n";

define("FOPEN_RESOURCE"1);

$shm_id shm_attach(FOPEN_RESOURCE);
if (
$shm_id === false) {
    exit(
"Fail to attach shared memory.\n");
}

$fopen_resource fopen("/tmp/phpSharedMemory.bin""w");

$a =  array("Teste1"1);
if (!
shm_put_var($shm_id$a$a)) {
    exit(
"Failed to put var 1 in shared memory $shm_id.\n");
}

echo 
"F: ".$a[0].":".$a[1]."\n";
$pid pcntl_fork();

if(
$pid == -1) {
  die(
"could not fork\n");
}
else if (
$pid) {
   
$a = array("Teste2"3);
    if (!
shm_put_var($shm_id$a$a)) {
        exit(
"Failed to put var 1 in shared memory $shm_id.\n");
    }
    echo 
"P1: ".$a[0].":".$a[1]."\n";
} else {
   
sleep(2);
   
$a shm_get_var($shm_id$a);
    echo 
"P2: ".$a[0].":".$a[1]."\n";
}
pcntl_wait($status);
exit();
?>
2008-09-27 17:18:13
http://php5.kiev.ua/manual/ru/function.shm-get-var.html
hello everyone i came up with some sort of solution to the shm_get_var() 
returns false on error/returns a boolean false variable problem.

test script

<?php
   
    error_reporting
(E_ALL);
   
ini_set('display_errors''1');
   
    echo 
'<pre>';
    echo 
ini_get('sysvshm.init_mem');
   
    require_once(
'ClassShmWrapper.php5');
   
   
$nKey ftok(__FILE__,'x');
   
   
$myShm = new ClassShmWrapper($nKey);
   
   
$myShm->attachToSegment();
   
   
#$mValue = range(1,rand(3,10));
    #$myShm->nVarKey = count($mrValue);
   
    #$mValue = FALSE;
   
    /*
    $mValue = TRUE;
    $myShm->nVarKey = 1;
    $myShm->mVar = $mValue;
    $myShm->putVarToSegment();
    */
   
    #$myShm->nVarKey = 2;
   
$myShm->nVarKey 1;
   
    if (
$myShm->getVarFromSegment()) {
        echo 
"found var in shm\n";
    }
    else {
        echo 
"could NOT find var in shm\n";
    }
   
   
$myShm->detachFromSegment();
   
    echo 
"\ndumping " '$myShm->mVar' "\n";
   
var_dump($myShm->mVar);
   
?>

class for using the shm_ functions & class for storing boolean values

<?php
   
   
class ClassShmWrapper {
       
        public 
$nPermissions;
        public 
$nKey;
        public 
$nBytesMemorySize;
       
        public 
$nShmId;
       
        public 
$nVarKey;
        public 
$mVar;
       
       
       
        public function 
__construct($nKey,$nBytesMemorySize=50000,$nPermissions=0666) {
           
           
$this->nKey $nKey;
           
$this->nBytesMemorySize $nBytesMemorySize;
           
$this->nPermissions $nPermissions;
        }
       
       
        public function 
attachToSegment() {
           
$this->nShmId shm_attach($this->nKey,$this->nBytesMemorySize,$this->nPermissions);
        }
       
       
        public function 
detachFromSegment() {
           
shm_detach($this->nShmId);
        }
       
       
        public function 
removeSegment() {
           
shm_remove($this->nShmId);
        }
       
       
        public function 
getVarFromSegment() {
           
           
$mVar NULL;
           
            if ((
$mVar = @shm_get_var($this->nShmId,$this->nVarKey)) !== FALSE) {
               
               
$this->mVar $mVar;
               
                unset(
$mVar);
               
               
/*
                    For variables of type boolean we need to access an object property which stores the boolean value.
                    This is needed as shm_get_var() could return FALSE when returning a boolean variable set to FALSE
                    or when a non-existing variable key was tried to access!
                */
               
               
if ($this->mVar instanceof ClassShmBooleanWrapper) {
                   
$this->mVar $this->mVar->bVal;
                }
               
                return 
TRUE;
            }
            else {
               
                return 
FALSE;
            }
           
        }
       
       
       
/**
        * Puts a PHP variable into shared memory (or updates an existing one for the given variable key).
        *
        * @return boolean returns TRUE on success/FALSE on error
        */
       
public function putVarToSegment() {
           
           
// cmp -> comment getVarFromSegment()
           
if (is_bool($this->mVar)) {
               
                return 
shm_put_var($this->nShmId,$this->nVarKey,new ClassShmBooleanWrapper($this->mVar));
               
            }
            else {
                return 
shm_put_var($this->nShmId,$this->nVarKey,$this->mVar);
            }
           
        }
       
       
        public function 
removeVarFromSgement() {
           
           
shm_remove_var($this->nShmId,$this->nVarKey);
        }
       
    } 
// end class
   
   
   
class ClassShmBooleanWrapper {
       
        public 
$bVal;
       
        public function 
__construct($bVal) {
           
$this->bVal $bVal;
        }
       
    } 
// end class
   
?>
2009-06-24 05:19:21
http://php5.kiev.ua/manual/ru/function.shm-get-var.html
If any body has problem with shm_get_var();

this code correctly work with boolean-values^
<?php
if(shm_has_var ($this->shm_mem_id$_varno)){
           
$_value shm_get_var($this->shm_mem_id$_varno);
        }else{
           
$_value NULL;
        }
?>
2013-02-28 16:38:29
http://php5.kiev.ua/manual/ru/function.shm-get-var.html

    Поддержать сайт на родительском проекте КГБ