php实现读取内存顺序号
只是做记录,osc本站应该有重复的
semWrapper.class.php
/* *信号量(Semaphore)。 *这是一个包装类,用于解决不同平台下对“信号量”的不同实现方式。 *目前这个类只是象征性的,在Windows平台下实际是空跑(并没有真的实现互斥)。 */ classSemWrapper { private$hasSemSupport; private$sem; constSEM_KEY=1; publicfunction__construct() { $this->hasSemSupport=function_exists('sem_get'); if($this->hasSemSupport){ $this->sem=sem_get(self::SEM_KEY); } } publicfunctionacquire(){ if($this->hasSemSupport){ returnsem_acquire($this->sem); } returntrue; } publicfunctionrelease(){ if($this->hasSemSupport){ returnsem_release($this->sem); } returntrue; } }
SeqGenerator.class.php
/* *顺序号发生器。 */ classSeqGenerator { constSHM_KEY=1; /** *对顺序号发生器进行初始化。 *仅在服务器启动后的第一次调用有效,此后再调用此方法没有实际作用。 *@paramint$start产生顺序号的起始值。 *@returnboolean返回true表示成功。 */ staticpublicfunctioninit($start=1) { //通过信号量实现互斥,避免对共享内存的访问冲突 $sw=newSemWrapper; if(!$sw->acquire()){ returnfalse; } //打开共享内存 $shm_id=shmop_open(self::SHM_KEY,'n',0644,4); if(empty($shm_id)){ //因使用了'n'模式,如果无法打开共享内存,可以认为该共享内存已经创建,无需再次初始化 $sw->release(); returntrue; } //在共享内存中写入初始值 $size=shmop_write($shm_id,pack('L',$start),0); if($size!=4){ shmop_close($shm_id); $sw->release(); returnfalse; } //关闭共享内存,释放信号量 shmop_close($shm_id); $sw->release(); returntrue; } /** *产生下一个顺序号。 *@returnint产生的顺序号 */ staticpublicfunctionnext() { //通过信号量实现互斥,避免对共享内存的访问冲突 $sw=newSemWrapper; if(!$sw->acquire()){ return0; } //打开共享内存 $shm_id=shmop_open(self::SHM_KEY,'w',0,0); if(empty($shm_id)){ $sw->release(); return0; } //从共享内存中读出顺序号 $data=shmop_read($shm_id,0,4); if(empty($data)){ $sw->release(); return0; } $arr=unpack('L',$data); $seq=$arr[1]; //把下一个顺序号写入共享内存 $size=shmop_write($shm_id,pack('L',$seq+1),0); if($size!=4){ $sw->release(); return0; } //关闭共享内存,释放信号量 shmop_close($shm_id); $sw->release(); return$seq; } }
page.php
//使用方法 $seq=SeqGenerator::next(); var_dump($seq);
以上所述就是本文的全部内容了,希望大家能够喜欢。