php实现读取内存顺序号

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

 
 

只是做记录,osc本站应该有重复的

semWrapper.class.php

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

/*
* 信号量(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

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85

/*
* 顺序号发生器。
*/
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

?

1
2
3
4
5

//使用方法
 
$seq = SeqGenerator::next();
 
var_dump($seq);

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

时间: 2024-08-04 05:10:50

php实现读取内存顺序号的相关文章

php实现读取内存顺序号_php实例

只是做记录,osc本站应该有重复的 semWrapper.class.php /* * 信号量(Semaphore). * 这是一个包装类,用于解决不同平台下对"信号量"的不同实现方式. * 目前这个类只是象征性的,在 Windows 平台下实际是空跑(并没有真的实现互斥). */ class SemWrapper { private $hasSemSupport; private $sem; const SEM_KEY = 1; public function __construct

XmlReader 读取器读取内存流 MemoryStream 的注意事项

stream|xml MemoryStream对象提供了无需进行IO就可以创建Stream的方法,XmlTextWriter和XmlReader提供快速书写和读取XML内容的方法,结合MemoryStream,就可以直接在内存中构造XmlTextWriter,并用XmlReader进行读取. 使用MemoryStream和XmlTextWriter进行书写XML,需要注意两点:XmlTextWriter.Flush操作和重设MemoryStream.Position = 0. C# <%@ Pa

sqlite数据库-请问怎么用sqlite读取内存中的数据库?

问题描述 请问怎么用sqlite读取内存中的数据库? 我想把sqlite数据库包含到c#项目中,然后用的时候只读,,请问怎么用sqlite读取内存中的数据库? 解决方案 内存中数据库是什么?memcache?直接有库访问 解决方案二: 在程序启动的时候读取到List<实体>里面,以后直接用linq去查询集合. 解决方案三: System.Data.SQLite.dll就是用来操作SQLite的

jna-JNA 读取内存中的指针地址比实际的长

问题描述 JNA 读取内存中的指针地址比实际的长 通过接口得到了一个内存的指针,通过这个指针得到了在读取另一个指针的时候,其地址后面比正确地址多了一段.

c++-C++ 处理图片像素时无法读取内存

问题描述 C++ 处理图片像素时无法读取内存 //bmps 中装的是CImage for(int i = 0; i < bmps[nIndex].GetHeight(); i++){ for(int j = 0; j < bmps[nIndex].GetWidth();j++){ BYTE * tp1=(BYTE*)bmps[nIndex].GetPixelAddress(i,j); BYTE * tp2=(BYTE*)bmps[nIndex+1].GetPixelAddress(i,j);

游戏-cocos2d-x的一个无法读取内存的问题

问题描述 cocos2d-x的一个无法读取内存的问题 想请教一个关于内存的一个象棋游戏游戏内出现的问题,象棋游戏我在做AI的时候,分简单和困难,下面是简单模式AI产生一个步骤的接口(需要传入的是游戏场景指针): Step* AI::genStep(SceneGameReal* game) { Array* allMove = allPossibleMove(game); int highScore = -100000;//初始化一个最高的走棋得分 Step* ret; for (int i =

当输入3个字母以上,执行到if (node[p].lchild == c) 无法读取内存

问题描述 当输入3个字母以上,执行到if (node[p].lchild == c) 无法读取内存 #include #include #include #define MAXBIT 100 #define MAXVALUE 10000 #define MAXLEAF 30 #define MAXNODE MAXLEAF*2 -1 using namespace std; typedef struct{ int bit[100]; int start; }Code; typedef struct

XmlReader 读取器读取内存流 MemoryStream 的注意事项_实用技巧

MemoryStream对象提供了无需进行IO就可以创建Stream的方法,XmlTextWriter和XmlReader提供快速书写和读取XML内容的方法,结合MemoryStream,就可以直接在内存中构造XmlTextWriter,并用XmlReader进行读取.  使用MemoryStream和XmlTextWriter进行书写XML,需要注意两点:XmlTextWriter.Flush操作和重设MemoryStream.Position = 0.  C#  <%@ Page Langu

怎么读取内存地址的数据?

问题描述 进程名:SRO_Client.exe进程ID:实时变化地址1:00D030F4(无偏移量)地址2:00D030F4(偏移量44c)1.有偏移量的地址怎么转换成实际地址?2.怎么读取指定进程,指定地址的内存数据?3.可以把内存地址作为循环变量,循环读取吗?4.请不要告诉我用C++,我不懂C++.... 解决方案 解决方案二:肯定要用c++,不安全代码啊,c#做不到的解决方案三:unsafecoderefertoMSDN解决方案四:API:BOOLReadProcessMemory(HAN