程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php實現讀取內存順序號

php實現讀取內存順序號

編輯:關於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);

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

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved