php实现读取内存顺序号
来源: 阅读:535 次 日期:2015-04-03 10:18:06
温馨提示: 小编为您整理了“php实现读取内存顺序号”,方便广大网友查阅!

这篇文章主要介绍了php实现读取内存顺序号,十分的简单实用,需要的朋友可以参考下

只是做记录,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);

以上所述就是本文的全部内容了,希望大家能够喜欢。

更多信息请查看IT技术专栏

更多信息请查看网络编程
手机网站地址:php实现读取内存顺序号
由于各方面情况的不断调整与变化, 提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!

2025国考·省考课程试听报名

  • 报班类型
  • 姓名
  • 手机号
  • 验证码
关于我们 | 联系我们 | 人才招聘 | 网站声明 | 网站帮助 | 非正式的简要咨询 | 简要咨询须知 | 加入群交流 | 手机站点 | 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65317125(9:00—18:00) 获取招聘考试信息及咨询关注公众号:
咨询QQ:526150442(9:00—18:00)版权所有:
云南网警报警专用图标
Baidu
map