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安装全攻略:APACHE
Oct 09 PHP
关于文本留言本的分页代码
Oct 09 PHP
在IIS7.0下面配置PHP 5.3.2运行环境的方法
Apr 13 PHP
PHP实现提取一个图像文件并在浏览器上显示的代码
Oct 06 PHP
ECMall支持SSL连接邮件服务器的配置方法详解
May 19 PHP
百度地图API使用方法详解
Aug 25 PHP
CI框架中$this->load->library()用法分析
May 18 PHP
php有效防止图片盗用、盗链的两种方法
Nov 01 PHP
php实现留言板功能(代码详解)
Mar 28 PHP
PHP实现批量清空删除指定文件夹所有内容的方法
May 30 PHP
PHP面向对象五大原则之里氏替换原则(LSP)详解
Apr 08 PHP
PHP实现的简单组词算法示例
Apr 10 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 UTF-8、Unicode和BOM问题
2010/05/18 PHP
PHP 遍历文件实现代码
2011/05/04 PHP
php中通过curl检测页面是否被百度收录
2013/09/27 PHP
ecshop 2.72如何修改后台访问地址
2015/03/03 PHP
PHP实现表单提交时去除斜杠的方法
2016/12/26 PHP
Gambit vs ForZe BO3 第一场 2.13
2021/03/10 DOTA
如何使用JS获取IE上传文件路径(IE7,8)
2013/07/08 Javascript
jQuery中ajax的使用与缓存问题的解决方法
2013/12/19 Javascript
JS二维数组的定义说明
2014/03/03 Javascript
用js的document.write输出的广告无阻塞加载的方法
2014/06/05 Javascript
jquery判断单选按钮radio是否选中的方法
2015/05/05 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
2015/06/15 Javascript
javascript巧用eval函数组装表单输入项为json对象的方法
2015/11/25 Javascript
JS从一组数据中找到指定的单条数据的方法
2016/06/02 Javascript
canvas绘制环形进度条
2017/02/23 Javascript
移动前端图片压缩上传的实例
2017/12/06 Javascript
vue实现绑定事件的方法实例代码详解
2019/06/20 Javascript
浅谈js中的attributes和Attribute的用法与区别
2020/07/16 Javascript
vue-cli或vue项目利用HBuilder打包成移动端app操作
2020/07/29 Javascript
详解JavaScript 高阶函数
2020/09/14 Javascript
OpenLayers3实现鼠标移动显示坐标
2020/09/25 Javascript
用Python编程实现语音控制电脑
2014/04/01 Python
python通过urllib2获取带有中文参数url内容的方法
2015/03/13 Python
python实现的简单FTP上传下载文件实例
2015/06/30 Python
python中函数默认值使用注意点详解
2016/06/01 Python
python GUI实例学习
2017/11/21 Python
python+splinter实现12306网站刷票并自动购票流程
2018/09/25 Python
python下PyGame的下载与安装过程及遇到问题
2019/08/04 Python
python 解决print数组/矩阵无法完整输出的问题
2020/02/19 Python
VS2019+python3.7+opencv4.1+tensorflow1.13配置详解
2020/04/16 Python
村党支部书记个人对照材料汇报
2014/10/26 职场文书
2014年教研工作总结
2014/12/06 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
驳回起诉民事裁定书
2015/05/19 职场文书
如何理解Vue简单状态管理之store模式
2021/05/15 Vue.js
Python 实现绘制子图及子图刻度的变换等问题
2021/05/31 Python