php shmop_open的问题
<!--
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);
}
}
?>
$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>
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号