最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

php實現(xiàn)讀取內存順序號

 更新時間:2015年03月29日 11:17:31   投稿:hebedich  
這篇文章主要介紹了php實現(xiàn)讀取內存順序號,十分的簡單實用,需要的朋友可以參考下

只是做記錄,osc本站應該有重復的

semWrapper.class.php

/*
 * 信號量(Semaphore)。
 * 這是一個包裝類,用于解決不同平臺下對“信號量”的不同實現(xiàn)方式。
 * 目前這個類只是象征性的,在 Windows 平臺下實際是空跑(并沒有真的實現(xiàn)互斥)。
 */
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

/*
 * 順序號發(fā)生器。
 */
class SeqGenerator
{
  const SHM_KEY = 1;
 
  /**
   * 對順序號發(fā)生器進行初始化。
   * 僅在服務器啟動后的第一次調用有效,此后再調用此方法沒有實際作用。
   * @param int $start 產(chǎn)生順序號的起始值。
   * @return boolean 返回 true 表示成功。
   */
  static public function init( $start = 1 )
  {
    // 通過信號量實現(xiàn)互斥,避免對共享內存的訪問沖突
    $sw = new SemWrapper;
    if ( ! $sw->acquire() ) {
      return false;
    }
 
    // 打開共享內存
    $shm_id = shmop_open( self::SHM_KEY, 'n', 0644, 4 );
    if ( empty($shm_id) ) {
      // 因使用了 'n' 模式,如果無法打開共享內存,可以認為該共享內存已經(jīng)創(chuàng)建,無需再次初始化
      $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;
  }
 
  /**
   * 產(chǎn)生下一個順序號。
   * @return int 產(chǎn)生的順序號
   */
  static public function next()
  {
    // 通過信號量實現(xiàn)互斥,避免對共享內存的訪問沖突
    $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

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

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

相關文章

最新評論

伊通| 常山县| 汶上县| 徐州市| 惠东县| 西藏| 金湖县| 柳江县| 尚志市| 烟台市| 丹凤县| 鄯善县| 海晏县| 秦安县| 交城县| 玉龙| 绥德县| 鄯善县| 屏山县| 昂仁县| 册亨县| 府谷县| 惠州市| 丰县| 多伦县| 桃园县| 普洱| 武胜县| 佛山市| 额尔古纳市| 泽普县| 南部县| 葵青区| 德江县| 安泽县| 宝鸡市| 瓮安县| 成安县| 德兴市| 伊吾县| 法库县|