Home > Backend Development > PHP Tutorial > PHP implements reading memory sequence number_PHP tutorial

PHP implements reading memory sequence number_PHP tutorial

WBOY
Release: 2016-07-13 09:59:12
Original
1259 people have browsed it

PHP implementation of reading memory sequence numbers

This article mainly introduces PHP implementation of reading memory sequence numbers. It is very simple and practical. Friends who need it can refer to it

Just for record keeping, there should be duplicates on osc site

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;

}

}

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. * This is a wrapper class used to solve the different implementations of "semaphores" on different platforms. * At present, this class is only symbolic, and it actually runs in vain on the Windows platform (mutual exclusion is not really implemented). */ 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;

 

/**

* Initialize the sequence number generator.

* This method is only valid for the first call after the server is started. Calling this method after that has no practical effect.

* @param int $start The starting value for generating sequence numbers.

* @return boolean Returns true to indicate success.

*/

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;

}

 

/**

* Generates the next sequence number.

* @return int generated sequence number

*/

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];

//Write the next sequence number into the shared memory

$size = shmop_write( $shm_id, pack( 'L', $seq 1 ), 0 );

if ( $size != 4 ) {

$sw->release();

return 0;

}

//Close shared memory and release the semaphore

shmop_close( $shm_id );

$sw->release();

return $seq;

}

}

page.php

?

1

2

3

4

5

//使用方法

 

$seq = SeqGenerator::next();

 

var_dump($seq);

1 2

3

4 5

//How to use $seq = SeqGenerator::next(); var_dump($seq);
The above is the entire content of this article, I hope you all like it. http://www.bkjia.com/PHPjc/976530.htmlwww.bkjia.comtruehttp: //www.bkjia.com/PHPjc/976530.htmlTechArticlephp implementation of reading memory sequence number This article mainly introduces php implementation of reading memory sequence number, which is very simple Practical, friends who need it can refer to it just for recording, osc this website should have important...
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template