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读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
Jul 31 PHP
php ci框架验证码实例分析
Jun 26 PHP
浅析php变量修饰符static的使用
Jun 28 PHP
php使用百度翻译api示例分享
Jan 31 PHP
php验证是否是md5编码的简单代码
Apr 01 PHP
WAMP环境中扩展oracle函数库(oci)
Jun 26 PHP
Laravel手动分页实现方法详解
Oct 09 PHP
通过chrome浏览器控制台(Console)进行PHP Debug的方法
Oct 19 PHP
PHP数字金额转换成中文大写显示
Jan 05 PHP
YII框架http缓存操作示例
Apr 29 PHP
php设计模式之享元模式分析【星际争霸游戏案例】
Mar 23 PHP
PHP实现页面静态化深入讲解
Mar 04 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
yii添删改查实例
2015/11/16 PHP
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
2016/03/21 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
2016/09/30 PHP
微信开发之获取JSAPI TICKET
2017/07/07 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
2017/12/25 PHP
PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析
2018/04/20 PHP
用表格输出1-1000之间的数字实现代码(附特效)
2013/04/21 Javascript
利用原生JavaScript获取元素样式只是获取而已
2014/10/08 Javascript
JavaScript获取各大浏览器信息图示
2015/11/20 Javascript
Angularjs中UI Router全攻略
2016/01/29 Javascript
Svg.js实例教程及使用手册详解(一)
2016/05/16 Javascript
AngularJs bootstrap详解及示例代码
2016/09/01 Javascript
关于vue.extend和vue.component的区别浅析
2017/08/16 Javascript
vue生成随机验证码的示例代码
2017/09/29 Javascript
Js判断H5上下滑动方向及滑动到顶部和底部判断的示例代码
2017/11/15 Javascript
详解Immutable及 React 中实践
2018/03/01 Javascript
浅谈微信小程序之官方UI框架we-ui使用教程
2018/08/20 Javascript
Vue 全家桶实现移动端酷狗音乐功能
2018/11/16 Javascript
微信小程序结合Storage实现搜索历史效果
2019/05/18 Javascript
vue中的面包屑导航组件实例代码
2019/07/01 Javascript
vuex+axios+element-ui实现页面请求loading操作示例
2020/02/02 Javascript
ant-design-vue 时间选择器赋值默认时间的操作
2020/10/27 Javascript
ptyhon实现sitemap生成示例
2014/03/30 Python
Python实现的百度站长自动URL提交小工具
2014/06/27 Python
python利用lxml读写xml格式的文件
2017/08/10 Python
tensorflow之tf.record实现存浮点数数组
2020/02/17 Python
python 如何在测试中使用 Mock
2021/03/01 Python
css3.0 图形构成实例练习二
2013/03/19 HTML / CSS
阿玛尼美国官方网站:Armani.com
2016/11/25 全球购物
实习鉴定评语
2014/01/19 职场文书
活动策划邀请函
2014/02/06 职场文书
法定代表人授权委托书
2014/09/19 职场文书
销售区域经理岗位职责
2015/04/10 职场文书
创业计划书之物流运送
2019/09/17 职场文书
每日六道java新手入门面试题,通往自由的道路
2021/06/30 Java/Android
Python+腾讯云服务器实现每日自动健康打卡
2021/12/06 Python