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 相关文章推荐
自动跳转中英文页面
Oct 09 PHP
php中批量修改文件后缀名的函数代码
Oct 23 PHP
PHP提取字符串中的图片地址[正则表达式]
Nov 12 PHP
php中大括号作用介绍
Mar 22 PHP
php笔记之:数据类型与常量的使用分析
May 14 PHP
如何给phpcms v9增加类似于phpcms 2008中的关键词表
Jul 01 PHP
php把session写入数据库示例
Feb 26 PHP
PHP利用header跳转失效的解决方法
Oct 24 PHP
php实现在线通讯录功能(附源码)
May 13 PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
May 22 PHP
php无限级分类实现方法分析
Oct 19 PHP
Laravel的加密解密与哈希实例讲解
Mar 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屏蔽过滤指定关键字的方法
2014/11/03 PHP
ZF框架实现发送邮件的方法
2015/12/03 PHP
php采集神器cURL使用方法详解
2016/02/19 PHP
[原创]php求圆周率的简单实现方法
2016/05/30 PHP
laravel实现上传图片并在页面显示的例子
2019/10/14 PHP
YII2框架中日志的配置与使用方法实例分析
2020/03/18 PHP
实现png图片和png背景透明(支持多浏览器)的方法
2009/09/08 Javascript
弹出窗口并且此窗口带有半透明的遮罩层效果
2014/03/13 Javascript
JavaScript框架(iframe)操作总结
2014/04/16 Javascript
浅谈jQuery事件绑定原理
2015/01/02 Javascript
基于JS实现类似支付宝支付密码输入框
2016/09/02 Javascript
js HTML5上传示例代码完整版
2016/10/10 Javascript
vue使用vue-cli快速创建工程
2017/07/28 Javascript
使用ionic(选项卡栏tab) icon(图标) ionic上拉菜单(ActionSheet) 实现通讯录界面切换实例代码
2017/10/20 Javascript
JavaScript实现QQ列表展开收缩扩展功能
2017/10/30 Javascript
基于JavaScript实现表格滚动分页
2017/11/22 Javascript
web前端页面生成exe可执行文件的方法
2018/02/08 Javascript
微信小程序如何获取手机验证码
2018/11/04 Javascript
JS使用数组实现的队列功能示例
2019/03/04 Javascript
JS实现烟花爆炸效果
2020/03/10 Javascript
详解vue 组件注册
2020/11/20 Vue.js
Python中利用Scipy包的SIFT方法进行图片识别的实例教程
2016/06/03 Python
利用Python爬取微博数据生成词云图片实例代码
2017/08/31 Python
python使用xslt提取网页数据的方法
2018/02/23 Python
django 自定义filter 判断if var in list的例子
2019/08/20 Python
python3实现名片管理系统(控制台版)
2020/11/29 Python
input元素的url类型和email类型简介
2012/07/11 HTML / CSS
纯html5+css3下拉导航菜单实现代码
2013/03/18 HTML / CSS
XD健身器材:Kevlar球、Crossfit健身球
2019/03/26 全球购物
酒店行政人事部经理职务说明书
2014/02/26 职场文书
关于梦想的演讲稿
2014/05/05 职场文书
2016年教育局“我们的节日——端午节”主题活动总结
2016/04/01 职场文书
python process模块的使用简介
2021/05/14 Python
MySQL读取JSON转换的方式
2022/03/18 MySQL
《最终幻想14》6.01版本4月5日推出 追加新任务新道具
2022/04/03 其他游戏
kubernetes集群搭建Zabbix监控平台的详细过程
2022/07/07 Servers