ホームページ  >  記事  >  バックエンド開発  >  PHP はメモリ シーケンス番号の読み取りを実装します_PHP チュートリアル

PHP はメモリ シーケンス番号の読み取りを実装します_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 09:59:121222ブラウズ

PHPはメモリシーケンス番号の読み取りを実装します

この記事では主にメモリシーケンス番号の読み取りを実装するためのPHPを紹介します。非常に簡単で実用的です。

記録保持のため、このサイトには重複があるはずです

semWrapper.class.php

?

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

/*

* セマフォ。

* これは、さまざまなプラットフォームでの「セマフォ」のさまざまな実装を解決するために使用されるラッパー クラスです。

* 現時点では、このクラスはシンボリックなだけであり、実際には Windows プラットフォームでは空で実行されます (相互排他は実際には実装されていません)。

*/

クラスSemWrapper

{

プライベート $hasSemSupport;

プライベート$sem;

const SEM_KEY = 1;

パブリック関数 __construct()

{

$this->hasSemSupport = function_exists( 'sem_get' );

if ( $this->hasSemSupport ) {

$this->sem = sem_get( self::SEM_KEY );

}

}

パブリック関数acquire() {

if ( $this->hasSemSupport ) {

return sem_acquire( $this->sem );

}

true を返す;

}

パブリック関数 release() {

if ( $this->hasSemSupport ) {

return sem_release( $this->sem );

}

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

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

/*

* 顺序号発生器。

*/

クラス SeqGenerator

{

const SHM_KEY = 1;

/**

* シーケンス番号ジェネレーターを初期化します。

* このメソッドは、サーバーの起動後の最初の呼び出しにのみ有効です。それ以降にこのメソッドを呼び出しても、実質的な効果はありません。

* @param int $start 生成されたシーケンス番号の開始値。

* @return boolean 成功を示す場合は true を返します。

*/

静的パブリック関数 init( $start = 1 )

{

// 信号量实现相互斥を通じて、共有内に保存されている侵入を回避します

$sw = 新しい SemWrapper;

if ( ! $sw->acquire() ) {

false を返す;

}

// 打开共享内存

$shm_id = shmop_open( self::SHM_KEY, 'n', 0644, 4 );

if ( empty($shm_id) ) {

// 'n' モードを使用しているため、無法起動共有内存存であれば、これは共有内存存済みであると見なされ、再初期化は必要ありません

$sw->release();

true を返す;

}

// 共有内存中写入初值

$size = shmop_write( $shm_id, Pack( 'L', $start ), 0 );

if ( $size != 4 ) {

shmop_close( $shm_id );

$sw->release();

false を返す;

}

// 关闭共享内存,释放信号量

shmop_close( $shm_id );

$sw->release();

true を返す;

}

/**

* 次のシーケンス番号を生成します。

* @return int 生成されたシーケンス番号

*/

静的パブリック関数 next()

{

// 信号量实现相互斥を通じて、共有内に保存されている侵入を回避します

$sw = 新しい SemWrapper;

if ( ! $sw->acquire() ) {

0を返す;

}

// 打开共享内存

$shm_id = shmop_open( self::SHM_KEY, 'w', 0, 0 );

if ( empty($shm_id) ) {

$sw->release();

0を返す;

}

// 从共享内存中读出顺序号

$data = shmop_read( $shm_id, 0, 4 );

if ( empty($data) ) {

$sw->release();

0を返す;

}

$arr = unpack( 'L', $data );

$seq = $arr[1];

//次のシーケンス番号を共有メモリに書き込みます

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

if ( $size != 4 ) {

$sw->release();

0を返す;

}

//共有メモリを閉じてセマフォを解放します

shmop_close( $shm_id );

$sw->release();

$seq を返す;

}

}

page.php

?

1

2

3

4

5

//使い方

$seq = SeqGenerator::next();

var_dump($seq);

以上がこの記事の全内容です。皆さんに気に入っていただければ幸いです。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/976530.html技術記事この記事では、PHP でのメモリシーケンス番号の読み取りの実装を主に紹介します。非常に簡単で実用的です。このサイトは、記録を作成するために参照してください。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:php でファイルのサイズを計算する方法、_PHP チュートリアル次の記事:php でファイルのサイズを計算する方法、_PHP チュートリアル

関連記事

続きを見る