php實(shí)現(xiàn)讀取內(nèi)存順序號(hào)
只是做記錄,osc本站應(yīng)該有重復(fù)的
semWrapper.class.php
/*
* 信號(hào)量(Semaphore)。
* 這是一個(gè)包裝類,用于解決不同平臺(tái)下對(duì)“信號(hào)量”的不同實(shí)現(xiàn)方式。
* 目前這個(gè)類只是象征性的,在 Windows 平臺(tái)下實(shí)際是空跑(并沒(méi)有真的實(shí)現(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
/*
* 順序號(hào)發(fā)生器。
*/
class SeqGenerator
{
const SHM_KEY = 1;
/**
* 對(duì)順序號(hào)發(fā)生器進(jìn)行初始化。
* 僅在服務(wù)器啟動(dòng)后的第一次調(diào)用有效,此后再調(diào)用此方法沒(méi)有實(shí)際作用。
* @param int $start 產(chǎn)生順序號(hào)的起始值。
* @return boolean 返回 true 表示成功。
*/
static public function init( $start = 1 )
{
// 通過(guò)信號(hào)量實(shí)現(xiàn)互斥,避免對(duì)共享內(nèi)存的訪問(wèn)沖突
$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' 模式,如果無(wú)法打開共享內(nèi)存,可以認(rèn)為該共享內(nèi)存已經(jīng)創(chuàng)建,無(wú)需再次初始化
$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)存,釋放信號(hào)量
shmop_close( $shm_id );
$sw->release();
return true;
}
/**
* 產(chǎn)生下一個(gè)順序號(hào)。
* @return int 產(chǎn)生的順序號(hào)
*/
static public function next()
{
// 通過(guò)信號(hào)量實(shí)現(xiàn)互斥,避免對(duì)共享內(nèi)存的訪問(wèn)沖突
$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)存中讀出順序號(hào)
$data = shmop_read( $shm_id, 0, 4 );
if ( empty($data) ) {
$sw->release();
return 0;
}
$arr = unpack( 'L', $data );
$seq = $arr[1];
// 把下一個(gè)順序號(hào)寫入共享內(nèi)存
$size = shmop_write( $shm_id, pack( 'L', $seq + 1 ), 0 );
if ( $size != 4 ) {
$sw->release();
return 0;
}
// 關(guān)閉共享內(nèi)存,釋放信號(hào)量
shmop_close( $shm_id );
$sw->release();
return $seq;
}
}
page.php
//使用方法 $seq = SeqGenerator::next(); var_dump($seq);
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
- PHP 內(nèi)存緩存加速功能memcached安裝與用法
- PHP數(shù)組內(nèi)存耗用太多問(wèn)題的解決方法
- 訪問(wèn)php時(shí)提示內(nèi)存位置訪問(wèn)無(wú)效的解決辦法和思路分析
- 采用PHP函數(shù)memory_get_usage獲取PHP內(nèi)存清耗量的方法
- PHP中使用unset銷毀變量并內(nèi)存釋放問(wèn)題
- phpExcel導(dǎo)出大量數(shù)據(jù)出現(xiàn)內(nèi)存溢出錯(cuò)誤的解決方法
- 關(guān)于PHP內(nèi)存溢出問(wèn)題的解決方法
- 解析PHP中的內(nèi)存管理,PHP動(dòng)態(tài)分配和釋放內(nèi)存
- 解析PHP中的unset究竟會(huì)不會(huì)釋放內(nèi)存
- php統(tǒng)計(jì)時(shí)間和內(nèi)存使用情況示例分享
- php出現(xiàn)內(nèi)存位置訪問(wèn)無(wú)效錯(cuò)誤問(wèn)題解決方法
- PHP腳本內(nèi)存泄露導(dǎo)致Apache頻繁宕機(jī)解決方法
- PHP通過(guò)內(nèi)置函數(shù)memory_get_usage()獲取內(nèi)存使用情況
- php查詢mysql大量數(shù)據(jù)造成內(nèi)存不足的解決方法
- 解決PHP里大量數(shù)據(jù)循環(huán)時(shí)內(nèi)存耗盡的方法
- PHP內(nèi)存使用情況如何獲取
相關(guān)文章
PHP 將數(shù)組打亂 shuffle函數(shù)的用法及簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇PHP 將數(shù)組打亂 shuffle函數(shù)的用法及簡(jiǎn)單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06
php微信公眾號(hào)開發(fā)之現(xiàn)金紅包
這篇文章主要為大家詳細(xì)介紹了php微信公眾號(hào)開發(fā)之現(xiàn)金紅包,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04
thinkPHP簡(jiǎn)單導(dǎo)入和使用阿里云OSSsdk的方法
這篇文章主要介紹了thinkPHP簡(jiǎn)單導(dǎo)入和使用阿里云OSSsdk的方法,簡(jiǎn)單說(shuō)明了阿里云OSS的php sdk下載地址及thinkPHP導(dǎo)入與使用OSSsdk的方法,需要的朋友可以參考下2017-03-03
在laravel5.2中實(shí)現(xiàn)點(diǎn)擊用戶頭像更改頭像的方法
今天小編就為大家分享一篇在laravel5.2中實(shí)現(xiàn)點(diǎn)擊用戶頭像更改頭像的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10
三種php連接access數(shù)據(jù)庫(kù)方法
本文提供三種php連接access數(shù)據(jù)庫(kù)的方法2013-11-11
php輸入流php://input使用示例(php發(fā)送圖片流到服務(wù)器)
在做一個(gè)攝像頭拍照然后上傳的功能,php中使用php://input來(lái)獲取內(nèi)容,可以看下面的示例2013-12-12
PHP實(shí)現(xiàn)單條sql執(zhí)行多個(gè)數(shù)據(jù)的insert語(yǔ)句方法
今天小編就為大家分享一篇PHP實(shí)現(xiàn)單條sql執(zhí)行多個(gè)數(shù)據(jù)的insert語(yǔ)句方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10
thinkPHP框架RBAC實(shí)現(xiàn)原理分析
這篇文章主要介紹了thinkPHP框架RBAC實(shí)現(xiàn)原理,結(jié)合實(shí)例形式分析了thinkPHP框架中RBAC角色權(quán)限控制相關(guān)實(shí)現(xiàn)原理與操作技巧,需要的朋友可以參考下2019-02-02
PHP表單數(shù)據(jù)寫入MySQL數(shù)據(jù)庫(kù)的代碼
這篇文章主要介紹了PHP表單數(shù)據(jù)寫入MySQL數(shù)據(jù)庫(kù)的相關(guān)資料非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-05-05

