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 相关文章推荐
动态网站web开发 PHP、ASP还是ASP.NET
Oct 09 PHP
如何在PHP中使用Oracle数据库(2)
Oct 09 PHP
php调整gif动画图片尺寸示例代码分享
Dec 05 PHP
PHP防止post重复提交数据的简单例子
Jun 07 PHP
php格式输出文件var_export函数实例
Nov 15 PHP
PHP中$_SERVER使用说明
Jul 05 PHP
yii2带搜索功能的下拉框实例详解
May 12 PHP
浅谈PHP正则中的捕获组与非捕获组
Jul 18 PHP
Thinkphp事务操作实例(推荐)
Apr 01 PHP
万能的php分页类
Jul 06 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
Jun 13 PHP
微信JSSDK分享功能图文实例详解
Apr 08 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 上传文件的方法(类)
2009/07/30 PHP
php中使用Imagick实现图像直方图的实现代码
2011/08/30 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
2014/03/13 PHP
yii2中添加验证码的实现方法
2016/01/09 PHP
javascript parseInt 函数分析(转)
2009/03/21 Javascript
JavaScript浏览器选项卡效果
2010/08/25 Javascript
JS读取cookies信息(记录用户名)
2012/01/10 Javascript
一个关于javascript匿名函数的问题分析
2012/03/30 Javascript
ajax不执行success回调而是执行了error回调
2012/12/10 Javascript
判定是否原生方法的JS代码
2013/11/12 Javascript
原生Javascript封装的一个AJAX函数分享
2014/10/11 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
2015/05/20 Javascript
JavaScript代码实现左右上下自动晃动自动移动
2016/04/08 Javascript
Node.js中process模块常用的属性和方法
2016/12/13 Javascript
jQuery模拟下拉框选择对应菜单的内容
2017/03/07 Javascript
微信小程序中使用自定义图标(阿里icon)的方法
2018/08/20 Javascript
angular 未登录状态拦截路由跳转的方法
2018/10/09 Javascript
vue+element创建动态的form表单及动态生成表格的行和列
2019/05/20 Javascript
在layui中对table中的数据进行判断(0、1)转换为提示信息的方法
2019/09/28 Javascript
详解node.js 事件循环
2020/07/22 Javascript
Python数组条件过滤filter函数使用示例
2014/07/22 Python
解决Shell执行python文件,传参空格引起的问题
2018/10/30 Python
Python3按一定数据位数格式处理bin文件的方法
2019/01/24 Python
Python利用sqlacodegen自动生成ORM实体类示例
2019/06/04 Python
python使用Qt界面以及逻辑实现方法
2019/07/10 Python
解决pytorch报错:AssertionError: Invalid device id的问题
2020/01/10 Python
pandas和spark dataframe互相转换实例详解
2020/02/18 Python
使用keras实现BiLSTM+CNN+CRF文字标记NER
2020/06/29 Python
韩国三星集团旗下时尚品牌官网:SSF SHOP
2016/08/02 全球购物
工商企业管理实习自我鉴定
2013/12/04 职场文书
2014个人反腐倡廉思想汇报
2014/09/15 职场文书
2014教师评职称工作总结
2014/11/10 职场文书
幼儿园感谢信
2015/01/21 职场文书
MBA推荐信怎么写
2015/03/25 职场文书
基于Java的MathML转图片的方法(示例代码)
2021/06/23 Java/Android
SQL Server代理:理解SQL代理错误日志处理方法
2021/06/30 SQL Server