Home >Backend Development >PHP Tutorial >php shmop_open的有关问题

php shmop_open的有关问题

WBOY
WBOYOriginal
2016-06-13 10:27:101069browse

php shmop_open的问题

PHP code
<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><?php $arr=array();function application($key,$value=""){    global $arr;    if($value=="")    {        $shm_id = @shmop_open(12345, "a", 0644,100);    }else{        @$shm_id = shmop_open(12345, "c",0,0);        if(!$shm_id)        {            $shm_id=shmop_open(12345,"c",0644,100);        }    }    @$byte=shmop_read($shm_id,0,1024*1024);    if(!$byte){        return "";    }else{        if($byte!=""){            $arr=unserialize($byte);        }else{            return "";        }    }    if($value=="")//取值    {        shmop_close($shm_id);        if(array_key_exists($key,$arr))        {            return $arr[$key];        }        return "";    }else{        $arr[$key]=$value;        shmop_write($shm_id,serialize($arr),0);        shmop_close($shm_id);    }}?>


我在php中实现asp中的application对象的功能
目前的问题是在同一个http请求之中,执行了application("a","1"),那么application("a")会返回1,上面这个函数是正常的
但如果开始第二个请求了,application("a")就取不到值了
问题出在哪儿啊?


------解决方案--------------------
shmop_open(12345, "a", 0644,100);
表示最大可能的空间(字节数)
而你 shmop_read($shm_id,0,1024*1024);
读取时就越界了,这就是所谓的内存溢出
------解决方案--------------------
一般可以这样写
PHP code
$p = new shared;//$p->a = 'abcd';//$p->b = 1234;print_r($p->_all);echo $p->b;class shared {  private $shm_id;  private $shm_key = 0xff3;  private $shm_size = 1024;  function __construct() {    $this->shm_id = shmop_open($this->shm_key, "c", 0644, $this->shm_size) or die('申请失败');  }  function __get($name) {    $buf = shmop_read($this->shm_id, 0, $this->shm_size);    $buf = unserialize(trim($buf));    if($name == '_all') return $buf;    return isset($buf[$name]) ? $buf[$name] : false;  }  function __set($name, $value) {    $buf = shmop_read($this->shm_id, 0, $this->shm_size);    $buf = unserialize(trim($buf));    $buf[$name] = $value;    $buf = serialize($buf);    if(strlen($buf) >= $this->shm_size) die('空间不足');    shmop_write($this->shm_id, $buf, 0) or die('写入失败');  }}<br><font color="#e78608">------解决方案--------------------</font><br>和你上一个帖子一样,讨论是在基于 php_shmop.dll 扩展的<br><br>linux 中有另外的方法,但原理是一样的<br>php_shmop 也可以在 linux 中编译,但他却是为 window 设计的<br><br><font color="#e78608">------解决方案--------------------</font><br>我就明着告诉你,你这个问题大了.<br><br>共享内存区需要加锁操作, php没法设置进程共享的mutex, 你可以同样适用一个system v 的sem二值信号量来做锁.<div class="clear">
                 
              
              
        
            </div>
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn