shm_get_var

(PHP 4, PHP 5, PHP 7, PHP 8)

shm_get_var从共享内存中返回变量

描述

shm_get_var(SysvSharedMemory $shm, int $key): mixed

shm_get_var() 返回给定共享内存段中具有给定 key 的变量。该变量仍然存在于共享内存中。

参数

shm

shm_attach() 获得的共享内存段。

key

变量键。

返回值

返回具有给定键的变量。

变更日志

版本 描述
8.0.0 shm 现在期望一个 SysvSharedMemory 实例;之前,期望一个 resource

参见

添加注释

用户贡献注释 7 个注释

ricardophp at yahoo dot com dot br
15 年前
一个功能齐全的示例...

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

define("FOPEN_RESOURCE", 1);

$shm_id = shm_attach(FOPEN_RESOURCE);
if (
$shm_id === false) {
exit(
"无法附加共享内存。\n");
}

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

$a = array("Teste1", 1);
if (!
shm_put_var($shm_id, $a, $a)) {
exit(
"无法将变量 1 放入共享内存 $shm_id 中。\n");
}

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

if(
$pid == -1) {
die(
"无法分叉\n");
}
else if (
$pid) {
$a = array("Teste2", 3);
if (!
shm_put_var($shm_id, $a, $a)) {
exit(
"无法将变量 1 放入共享内存 $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();
?>
hackmac at nowhere dot com
15 年前
大家好,我提出了一些关于 shm_get_var() 的解决方案。
在出错时返回 false/返回布尔值 false 变量的问题。

测试脚本

<?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
"在 shm 中找到变量\n";
}
else {
echo
"无法在 shm 中找到变量\n";
}

$myShm->detachFromSegment();

echo
"\ndumping " . '$myShm->mVar' . "\n";
var_dump($myShm->mVar);

?>

用于使用 shm_ 函数的类和用于存储布尔值的类

<?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);

/*
对于布尔型变量,我们需要访问一个存储布尔值的属性。
这是因为 shm_get_var() 在返回设置为 FALSE 的布尔型变量时,或尝试访问不存在的变量键时,可能返回 FALSE!
*/

if ($this->mVar instanceof ClassShmBooleanWrapper) {
$this->mVar = $this->mVar->bVal;
}

return
TRUE;
}
else {

return
FALSE;
}

}


/**
* 将 PHP 变量放入共享内存(或更新给定变量键的现有变量)。
*
* @return boolean 成功返回 TRUE,失败返回 FALSE
*/
public function putVarToSegment() {

// cmp -> 注释 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

?>
JM
19 年前
为了跟进匿名、Bob Van Zant 和 chris 在 free-source 点 com 下面的帖子(或者,正如大多数人莫名其妙地写的那样,在上面)关于 PHP 警告和 shm_get_var 在变量键不存在时返回的 FALSE。

我的测试(使用 PHP4.3.4)表明 defined() 在这里毫无用处。因为 defined(string) 函数检查名称为 string 的常量是否存在,所以代码
<?php
if ( defined(@shm_get_var($mutex, $mutex_key)) {
...
}
?>
无论变量是否定义,行为都相同(“...”不会被执行)——除非 $mutex_key 恰好标识一个有效的字符串,该字符串恰好是常量的名称。:)

相反,
<?php
if ( @shm_get_var($mutex, $mutex_key) === FALSE ) {
...
}
?>
有效,前提是存储的对象实际上不是 FALSE(通过 <?php shm_put_var($mutex, $mutex_key, FALSE); ?>)

不过,如果能有一个完全万无一失的解决方案就好了。哦!
匿名
19 年前
你仍然会收到一个通知,使用 @

if(!defined(@shm_get_var($mutex, $mutex_key))) {
shm_put_var($mutex, $mutex_key, 0);
}
Bob Van Zant
19 年前
这似乎工作得很好,可以检测共享内存中键的不存在,并在发现时将其初始化为 0

if(!defined(shm_get_var($mutex, $mutex_key))) {
shm_put_var($mutex, $mutex_key, 0);
}
serg at red-sign dot ru
11 年前
如果有人在使用 shm_get_var(); 时遇到问题

这段代码可以正确处理布尔值^
<?php
if(shm_has_var ($this->shm_mem_id, $_varno)){
$_value = shm_get_var($this->shm_mem_id, $_varno);
}else{
$_value = NULL;
}
?>
php at pharse dot com
15 年前
我在使用 shm_get_var() 时被这个警告烦扰了

警告:shm_get_var() [function.shm-get-var]:变量键 2 在 PATH_TO_FILE 的第 64 行不存在。

你可以通过更改错误报告级别来抑制警告。要仅针对有问题的页面执行此操作,请包含以下行

<?php
error_reporting
(E_ERROR);
?>

更多信息:http://us.php.net/error_reporting
To Top