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 相关文章推荐
服务器端解压缩zip的脚本
Dec 22 PHP
smarty的保留变量问题
Oct 23 PHP
PHP服务器页面间跳转实现方法
Aug 02 PHP
Linux下实现PHP多进程的方法分享
Aug 16 PHP
PHP中使用匿名函数操作数据库的例子
Nov 17 PHP
php计算到指定日期还有多少天的方法
Apr 14 PHP
PHP中的Session对象如何使用
Sep 25 PHP
PHP+Ajax+JS实现多图上传
May 07 PHP
用PHP将Unicode 转化为UTF-8的实现方法(推荐)
Feb 08 PHP
数组任意位置插入元素,删除特定元素的实例
Mar 02 PHP
PHP封装的PDO数据库操作类实例
Jun 21 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
Feb 21 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 empty()与isset()区别的详细介绍
2013/06/17 PHP
PHP+Mysql基于事务处理实现转账功能的方法
2015/07/08 PHP
js 加载并解析XML字符串的代码
2009/12/13 Javascript
javascript中"/"运算符常见错误
2010/10/13 Javascript
基于jQuery的input输入框下拉提示层(自动邮箱后缀名)
2012/06/14 Javascript
通过AJAX的JS、JQuery两种方式解析XML示例介绍
2013/09/23 Javascript
30个经典的jQuery代码开发技巧
2014/12/15 Javascript
原生javascript实现DIV拖拽并计算重复面积
2015/01/02 Javascript
jQuery中:button选择器用法实例
2015/01/04 Javascript
JS+CSS实现可拖动的弹出提示框
2015/02/16 Javascript
jquery实现表单验证并阻止非法提交
2015/07/09 Javascript
js以及jquery实现手风琴效果
2020/04/17 Javascript
完美实现js焦点轮播效果(一)
2017/03/07 Javascript
基于vue实现分页效果
2017/11/06 Javascript
Vue自定义指令实现checkbox全选功能的方法
2018/02/28 Javascript
javascript实现贪吃蛇小练习
2020/07/05 Javascript
python实现的简单文本类游戏实例
2015/04/28 Python
在Python中操作字符串之rstrip()方法的使用
2015/05/19 Python
Python通过OpenCV的findContours获取轮廓并切割实例
2018/01/05 Python
Python参数类型以及常见的坑详解
2019/07/08 Python
python数据化运营的重要意义
2019/11/25 Python
pytorch制作自己的LMDB数据操作示例
2019/12/18 Python
Python3.7+tkinter实现查询界面功能
2019/12/24 Python
TensorFLow 不同大小图片的TFrecords存取实例
2020/01/20 Python
详解使用双缓存解决Canvas clearRect引起的闪屏问题
2019/04/29 HTML / CSS
意大利在线眼镜精品店:Ottica Lipari
2019/11/11 全球购物
美国最大和最受信任的二手轮胎商店:Bestusedtires.com
2020/06/02 全球购物
mysql_pconnect()和mysql_connect()有什么区别
2012/05/25 面试题
高中生学习生活的自我评价
2013/10/09 职场文书
《乞巧》教学反思
2014/02/27 职场文书
爱护草坪标语
2014/06/24 职场文书
购房公证委托书(2014版)
2014/09/12 职场文书
2014年安全生产工作总结
2014/11/13 职场文书
2014年度思想工作总结
2014/11/27 职场文书
医德医风自我评价2015
2015/03/03 职场文书
女方家长婚礼致辞
2015/07/27 职场文书