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 相关文章推荐
PHP实现用户认证及管理完全源码
Mar 11 PHP
PHP编程中字符串处理的5个技巧小结
Nov 13 PHP
php5.3 废弃函数小结
May 16 PHP
探讨各种PHP字符串函数的总结分析
Jun 05 PHP
解析php中var_dump,var_export,print_r三个函数的区别
Jun 21 PHP
基于php常用函数总结(数组,字符串,时间,文件操作)
Jun 27 PHP
php通过分类列表产生分类树数组的方法
Apr 20 PHP
PHP IDE PHPStorm配置支持友好Laravel代码提示方法
May 12 PHP
Symfony2创建页面实例详解
Mar 18 PHP
PHP控制反转(IOC)和依赖注入(DI)
Mar 13 PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
Apr 04 PHP
PHP实现基于3DES算法加密解密字符串示例
Aug 24 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
php判断字符以及字符串的包含方法属性
2008/08/30 PHP
php 正则 过滤html 的超链接
2009/06/02 PHP
php中异常处理方法小结
2015/01/09 PHP
简单谈谈PHP面向对象之标识对象
2017/06/27 PHP
jquery怎样实现ajax联动框(二)
2013/03/08 Javascript
jquery实现图片左右间隔滚动特效(可自动播放)
2013/05/08 Javascript
Jquery实现列表(隔行换色,全选,鼠标滑过当前行)效果实例
2013/06/09 Javascript
javascript入门教程基础篇
2015/11/16 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
深入理解jQuery 事件处理
2016/06/14 Javascript
js removeChild 方法深入理解
2016/08/16 Javascript
URL中“#” “?” &“”号的作用浅析
2017/02/04 Javascript
ie下js不执行的几种可能
2017/02/28 Javascript
BootStrap的两种模态框方式
2017/05/10 Javascript
Vue如何实现组件的源码解析
2017/06/08 Javascript
微信小程序实现多个按钮toggle功能的实例
2017/06/13 Javascript
React实践之Tree组件的使用方法
2017/09/30 Javascript
vue+springmvc导出excel数据的实现代码
2018/06/27 Javascript
React组件内事件传参实现tab切换的示例代码
2018/07/04 Javascript
Vue+element-ui 实现表格的分页功能示例
2018/08/18 Javascript
Vue开发实现吸顶效果的示例代码
2018/08/21 Javascript
Vue.js更改调试地址端口号的实例
2018/09/19 Javascript
[48:53]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第一场
2014/05/26 DOTA
wxPython 入门教程
2008/10/07 Python
windows下python模拟鼠标点击和键盘输示例
2014/02/28 Python
Python类的用法实例浅析
2015/05/27 Python
开源Web应用框架Django图文教程
2017/03/09 Python
浅谈pyqt5中信号与槽的认识
2019/02/17 Python
NumPy排序的实现
2020/01/21 Python
python turtle工具绘制四叶草的实例分享
2020/02/14 Python
win10下opencv-python特定版本手动安装与pip自动安装教程
2020/03/05 Python
python 成功引入包但无法正常调用的解决
2020/03/09 Python
《山谷中的谜底》教学反思
2014/04/26 职场文书
个人查摆问题整改措施
2014/10/04 职场文书
镇党政领导班子民主生活会思想汇报
2014/10/11 职场文书
如何理解Vue前后端数据交互与显示
2021/05/10 Vue.js