php實現(xiàn)讀取內(nèi)存順序號
更新時間:2015年03月29日 11:17:31 投稿:hebedich
這篇文章主要介紹了php實現(xiàn)讀取內(nèi)存順序號,十分的簡單實用,需要的朋友可以參考下
只是做記錄,osc本站應(yīng)該有重復(fù)的
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ā)生器進行初始化。 * 僅在服務(wù)器啟動后的第一次調(diào)用有效,此后再調(diào)用此方法沒有實際作用。 * @param int $start 產(chǎn)生順序號的起始值。 * @return boolean 返回 true 表示成功。 */ static public function init( $start = 1 ) { // 通過信號量實現(xiàn)互斥,避免對共享內(nèi)存的訪問沖突 $sw = new SemWrapper; if ( ! $sw->acquire() ) { return false; } // 打開共享內(nèi)存 $shm_id = shmop_open( self::SHM_KEY, 'n', 0644, 4 ); if ( empty($shm_id) ) { // 因使用了 'n' 模式,如果無法打開共享內(nèi)存,可以認為該共享內(nèi)存已經(jīng)創(chuàng)建,無需再次初始化 $sw->release(); return true; } // 在共享內(nèi)存中寫入初始值 $size = shmop_write( $shm_id, pack( 'L', $start ), 0 ); if ( $size != 4 ) { shmop_close( $shm_id ); $sw->release(); return false; } // 關(guān)閉共享內(nèi)存,釋放信號量 shmop_close( $shm_id ); $sw->release(); return true; } /** * 產(chǎn)生下一個順序號。 * @return int 產(chǎn)生的順序號 */ static public function next() { // 通過信號量實現(xiàn)互斥,避免對共享內(nèi)存的訪問沖突 $sw = new SemWrapper; if ( ! $sw->acquire() ) { return 0; } // 打開共享內(nèi)存 $shm_id = shmop_open( self::SHM_KEY, 'w', 0, 0 ); if ( empty($shm_id) ) { $sw->release(); return 0; } // 從共享內(nèi)存中讀出順序號 $data = shmop_read( $shm_id, 0, 4 ); if ( empty($data) ) { $sw->release(); return 0; } $arr = unpack( 'L', $data ); $seq = $arr[1]; // 把下一個順序號寫入共享內(nèi)存 $size = shmop_write( $shm_id, pack( 'L', $seq + 1 ), 0 ); if ( $size != 4 ) { $sw->release(); return 0; } // 關(guān)閉共享內(nèi)存,釋放信號量 shmop_close( $shm_id ); $sw->release(); return $seq; } }
page.php
//使用方法 $seq = SeqGenerator::next(); var_dump($seq);
以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。
您可能感興趣的文章:
- PHP 內(nèi)存緩存加速功能memcached安裝與用法
- PHP數(shù)組內(nèi)存耗用太多問題的解決方法
- 訪問php時提示內(nèi)存位置訪問無效的解決辦法和思路分析
- 采用PHP函數(shù)memory_get_usage獲取PHP內(nèi)存清耗量的方法
- PHP中使用unset銷毀變量并內(nèi)存釋放問題
- phpExcel導(dǎo)出大量數(shù)據(jù)出現(xiàn)內(nèi)存溢出錯誤的解決方法
- 關(guān)于PHP內(nèi)存溢出問題的解決方法
- 解析PHP中的內(nèi)存管理,PHP動態(tài)分配和釋放內(nèi)存
- 解析PHP中的unset究竟會不會釋放內(nèi)存
- php統(tǒng)計時間和內(nèi)存使用情況示例分享
- php出現(xiàn)內(nèi)存位置訪問無效錯誤問題解決方法
- PHP腳本內(nèi)存泄露導(dǎo)致Apache頻繁宕機解決方法
- PHP通過內(nèi)置函數(shù)memory_get_usage()獲取內(nèi)存使用情況
- php查詢mysql大量數(shù)據(jù)造成內(nèi)存不足的解決方法
- 解決PHP里大量數(shù)據(jù)循環(huán)時內(nèi)存耗盡的方法
- PHP內(nèi)存使用情況如何獲取
相關(guān)文章
Yii2.0小部件GridView(兩表聯(lián)查/搜索/分頁)功能的實現(xiàn)代碼
這篇文章主要介紹了Yii2.0小部件GridView(兩表聯(lián)查/搜索/分頁)功能的實現(xiàn)代碼,需要的朋友可以參考下2017-08-08tp5實現(xiàn)微信小程序多圖片上傳到服務(wù)器功能
這最近在做一個教育類的小商城的微信小程序,用到了上傳多個圖片文件到服務(wù)器端。下面腳本之家小編給大家?guī)砹藅p5實現(xiàn)微信小程序多圖片上傳到服務(wù)器的方法,需要的朋友可以參考下2018-07-07PHP可變函數(shù)學(xué)習(xí)小結(jié)
PHP 支持可變函數(shù)的概念。這意味著如果一個變量名后有圓括號,PHP 將尋找與變量的值同名的函數(shù),并且嘗試執(zhí)行它,本文給大家分享php可變函數(shù)學(xué)習(xí)小結(jié),對php可變函數(shù)相關(guān)知識感興趣的朋友一區(qū)學(xué)習(xí)吧2015-11-11php使用 readfile() 函數(shù)設(shè)置文件大小大小的方法
本文通過實例代碼給大家講解了php使用 readfile() 函數(shù)設(shè)置文件大小大小的方法,需要的的朋友參考下吧2017-08-08