この記事では主にメモリシーケンス番号の読み取りを実装するためのPHPを紹介します。非常に簡単で実用的です。
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
|
/* * セマフォ。 * これは、さまざまなプラットフォームでの「セマフォ」のさまざまな実装を解決するために使用されるラッパー クラスです。 * 現時点では、このクラスはシンボリックなだけであり、実際には 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); |
以上がこの記事の全内容です。皆さんに気に入っていただければ幸いです。