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

php shmop_open的有关问题

Jun 13, 2016 pm 01:28 PM
quot shmop this

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

Copy after login


我在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-&gt;a = 'abcd';
//$p-&gt;b = 1234;
print_r($p-&gt;_all);
echo $p-&gt;b;

class shared {
  private $shm_id;
  private $shm_key = 0xff3;
  private $shm_size = 1024;
  function __construct() {
    $this-&gt;shm_id = shmop_open($this-&gt;shm_key, "c", 0644, $this-&gt;shm_size) or die('申请失败');
  }
  function __get($name) {
    $buf = shmop_read($this-&gt;shm_id, 0, $this-&gt;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-&gt;shm_id, 0, $this-&gt;shm_size);
    $buf = unserialize(trim($buf));
    $buf[$name] = $value;
    $buf = serialize($buf);
    if(strlen($buf) &gt;= $this-&gt;shm_size) die('空间不足');
    shmop_write($this-&gt;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>
Copy after login
Statement of this Website
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

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Article Tags

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Detailed example of how PHP creates shared memory to reduce load Detailed example of how PHP creates shared memory to reduce load Nov 03, 2022 pm 05:03 PM

Detailed example of how PHP creates shared memory to reduce load

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 Jun 13, 2016 am 10:23 AM

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决

An article that understands this point and catches up with 70% of front-end people An article that understands this point and catches up with 70% of front-end people Sep 06, 2022 pm 05:03 PM

An article that understands this point and catches up with 70% of front-end people

How to use this method in Java How to use this method in Java Apr 18, 2023 pm 01:58 PM

How to use this method in Java

Detailed explanation of this in JavaScript arrow function Detailed explanation of this in JavaScript arrow function Jan 25, 2024 pm 01:41 PM

Detailed explanation of this in JavaScript arrow function

Analysis of usage skills of this in jQuery Analysis of usage skills of this in jQuery Feb 22, 2024 pm 08:54 PM

Analysis of usage skills of this in jQuery

What is this? An in-depth analysis of this in JavaScript What is this? An in-depth analysis of this in JavaScript Aug 04, 2022 pm 05:02 PM

What is this? An in-depth analysis of this in JavaScript

How does JavaScript change this pointer? Brief analysis of three methods How does JavaScript change this pointer? Brief analysis of three methods Sep 19, 2022 am 09:57 AM

How does JavaScript change this pointer? Brief analysis of three methods

See all articles