php實現讀取記憶體順序號_PHP教程

來源:互聯網
上載者:User

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

以上所述就是本文的全部內容了,希望大家能夠喜歡。

http://www.bkjia.com/PHPjc/976530.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/976530.htmlTechArticlephp實現讀取記憶體順序號 這篇文章主要介紹了php實現讀取記憶體順序號,十分的簡單實用,需要的朋友可以參考下 只是做記錄,osc本站應該有重...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.