php实现读取内存顺序号


Posted in PHP onMarch 29, 2015

只是做记录,osc本站应该有重复的

semWrapper.class.php

/*
 * 信号量(Semaphore)。
 * 这是一个包装类,用于解决不同平台下对“信号量”的不同实现方式。
 * 目前这个类只是象征性的,在 Windows 平台下实际是空跑(并没有真的实现互斥)。
 */
class SemWrapper
{
  private $hasSemSupport;
  private $sem;
  const SEM_KEY = 1;
 
  public function __construct()
  {
    $this->hasSemSupport = function_exists( 'sem_get' );
    if ( $this->hasSemSupport ) {
      $this->sem = sem_get( self::SEM_KEY );
    }
  }
 
  public function acquire() {
    if ( $this->hasSemSupport ) {
      return sem_acquire( $this->sem );
    }
    return true;
  }
 
  public function release() {
    if ( $this->hasSemSupport ) {
      return sem_release( $this->sem );
    }
    return true;
  }
}

SeqGenerator.class.php

/*
 * 顺序号发生器。
 */
class SeqGenerator
{
  const SHM_KEY = 1;
 
  /**
   * 对顺序号发生器进行初始化。
   * 仅在服务器启动后的第一次调用有效,此后再调用此方法没有实际作用。
   * @param int $start 产生顺序号的起始值。
   * @return boolean 返回 true 表示成功。
   */
  static public function init( $start = 1 )
  {
    // 通过信号量实现互斥,避免对共享内存的访问冲突
    $sw = new SemWrapper;
    if ( ! $sw->acquire() ) {
      return false;
    }
 
    // 打开共享内存
    $shm_id = shmop_open( self::SHM_KEY, 'n', 0644, 4 );
    if ( empty($shm_id) ) {
      // 因使用了 'n' 模式,如果无法打开共享内存,可以认为该共享内存已经创建,无需再次初始化
      $sw->release();
      return true;
    }
 
    // 在共享内存中写入初始值
    $size = shmop_write( $shm_id, pack( 'L', $start ), 0 );
    if ( $size != 4 ) {
      shmop_close( $shm_id );
      $sw->release();
      return false;
    }
 
    // 关闭共享内存,释放信号量
    shmop_close( $shm_id );
    $sw->release();
    return true;
  }
 
  /**
   * 产生下一个顺序号。
   * @return int 产生的顺序号
   */
  static public function next()
  {
    // 通过信号量实现互斥,避免对共享内存的访问冲突
    $sw = new SemWrapper;
    if ( ! $sw->acquire() ) {
      return 0;
    }
 
    // 打开共享内存
    $shm_id = shmop_open( self::SHM_KEY, 'w', 0, 0 );
    if ( empty($shm_id) ) {
      $sw->release();
      return 0;
    }
 
    // 从共享内存中读出顺序号
    $data = shmop_read( $shm_id, 0, 4 );
    if ( empty($data) ) {
      $sw->release();
      return 0;
    }
 
    $arr = unpack( 'L', $data );
    $seq = $arr[1];
 
    // 把下一个顺序号写入共享内存
    $size = shmop_write( $shm_id, pack( 'L', $seq + 1 ), 0 );
    if ( $size != 4 ) {
      $sw->release();
      return 0;
    }
 
    // 关闭共享内存,释放信号量
    shmop_close( $shm_id );
    $sw->release();
    return $seq;
  }
}

page.php

//使用方法
 
$seq = SeqGenerator::next();
 
var_dump($seq);

以上所述就是本文的全部内容了,希望大家能够喜欢。

PHP 相关文章推荐
3.从实例开始
Oct 09 PHP
PHP session有效期问题
Apr 26 PHP
PHP 模拟登陆MSN并获得用户信息
May 16 PHP
PHP 防恶意刷新实现代码
May 16 PHP
解析thinkphp的左右值无限分类
Jun 20 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
Dec 29 PHP
php similar_text()函数的定义和用法
May 12 PHP
Laravel中log无法写入问题的解决
Jun 17 PHP
Thinkphp5行为使用方法汇总
Dec 21 PHP
PHP getName()函数讲解
Feb 03 PHP
php 多继承的几种常见实现方法示例
Nov 18 PHP
thinkphp5框架路由原理与用法详解
Feb 11 PHP
php实现插入排序
Mar 29 #PHP
php实现插入数组但不影响原有顺序的方法
Mar 27 #PHP
WordPress自定义时间显示格式
Mar 27 #PHP
在php和MySql中计算时间差的方法详解
Mar 27 #PHP
PHP连接access数据库
Mar 27 #PHP
使用新浪微博API的OAuth认证发布微博实例
Mar 27 #PHP
新浪微博OAuth认证和储存的主要过程详解
Mar 27 #PHP
You might like
全国FM电台频率大全 - 19 广东省
2020/03/11 无线电
PHP中数组的三种排序方法分享
2012/05/07 PHP
分享一个PHP数据流应用的简单例子
2012/06/01 PHP
PHP中soap的用法实例
2014/10/24 PHP
详解WordPress中的头像缓存和代理中的缓存更新方法
2016/03/01 PHP
Yii框架实现的验证码、登录及退出功能示例
2017/05/20 PHP
PHP实现将标点符号正则替换为空格的方法
2017/08/09 PHP
PHP去除空数组且数组键名重置的讲解
2019/02/28 PHP
jsTree树控件(基于jQuery, 超强悍)[推荐]
2009/09/01 Javascript
javascript的字符串按引用复制和传递,按值来比较介绍与应用
2012/12/28 Javascript
一个页面元素appendchild追加到另一个页面元素的问题
2013/01/27 Javascript
JS获取DropDownList的value值与text值的示例代码
2014/01/07 Javascript
jquery的ajax异步请求接收返回json数据实例
2014/06/16 Javascript
js简单实现竖向tab选项卡的方法
2015/05/04 Javascript
使用Raygun来自动追踪AngularJS中的异常
2015/06/23 Javascript
jQuery实现仿新浪微博浮动的消息提示框(可智能定位)
2015/10/10 Javascript
jQuery验证插件validate使用详解
2016/05/11 Javascript
jQuery简单实现仿京东分类导航层效果
2016/06/07 Javascript
使用jquery+iframe做一个ajax上传效果(实例)
2017/08/24 jQuery
select标签设置默认选中的选项方法
2018/03/02 Javascript
jQuery使用each遍历循环的方法
2018/09/19 jQuery
JSX在render函数中的应用详解
2019/09/04 Javascript
教你用python3根据关键词爬取百度百科的内容
2016/08/18 Python
python下实现二叉堆以及堆排序的示例
2017/09/29 Python
对python的bytes类型数据split分割切片方法
2018/12/04 Python
Python基于pip实现离线打包过程详解
2020/05/15 Python
深入浅析python 中的self和cls的区别
2020/06/20 Python
详解Pycharm第三方库的安装及使用方法
2020/12/29 Python
车间工艺员岗位职责
2013/12/09 职场文书
安全检查与奖惩制度
2014/01/23 职场文书
乡镇保密工作责任书
2014/07/28 职场文书
学生未请假就回家检讨书
2014/09/22 职场文书
吃空饷专项整治方案
2014/10/27 职场文书
2016学习雷锋精神活动倡议书
2015/04/27 职场文书
敬老院志愿者活动总结
2015/05/06 职场文书
PostgreSQL解析URL的方法
2021/08/02 PostgreSQL