时间:2021-07-01 10:21:17 帮助过:4人阅读
- <!--
- 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二值信号量来做锁.