欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

php shmop_open的有关问题

程序员文章站 2022-06-05 16:37:59
...
php shmop_open的问题
PHP code



我在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('写入失败');
  }
}

------解决方案--------------------
和你上一个帖子一样,讨论是在基于 php_shmop.dll 扩展的

linux 中有另外的方法,但原理是一样的
php_shmop 也可以在 linux 中编译,但他却是为 window 设计的

------解决方案--------------------
我就明着告诉你,你这个问题大了.

共享内存区需要加锁操作, php没法设置进程共享的mutex, 你可以同样适用一个system v 的sem二值信号量来做锁.
php shmop_open的有关问题

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

相关文章

相关视频