php下通过系统信号量加锁方式获取递增序列id

php下通过系统信号量加锁方式获取递增序列id

ID:6878406

大小:26.00 KB

页数:3页

时间:2018-01-29

php下通过系统信号量加锁方式获取递增序列id_第1页
php下通过系统信号量加锁方式获取递增序列id_第2页
php下通过系统信号量加锁方式获取递增序列id_第3页
资源描述:

《php下通过系统信号量加锁方式获取递增序列id》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、PHP下通过系统信号量加锁方式获取递增序列ID.txt*一篇一篇的翻着以前的的签名,那时候的签名有多幼稚就有多么的幼稚。你连让我报复的资格都没有-〞好想某天来电显示是你的号码。好想某天你的状态是为我而写。 有些人,我们明知道是爱的,也要去放弃,因为没结局前一阵子,设计LAJP时需要在PHP中生成唯一ID,看似小菜一碟却着实让我为难了,在Java中一个同步方法即可搞定的事,但在PHP中却没有好的解决思路。--在网上搜了搜,有两个办法但都不太好:一个是简单的以进程ID+时间戳,或进程ID+随机数来产生近似的唯一ID,虽简单

2、但对于追求“完美”的我不愿这样凑合,再说Apache2以后进程会维持相当长得时间,生成的ID发生碰撞的几率还是比较大的;第二个思路是通过Mysql的自增字段,这个就更不能考虑了,效率低不说,我的设计里压根就没数据库。递增ID的获取是个过程:1.从全局某个存储中读取ID2.给ID加13.将ID重新存入全局存储在多进程或线程的程序中需要将上述3步作为单步的原子操作,才能保证ID的唯一。Java中很好解决,这是因为Java程序大多以多线程方式运行,每个线程都能共享Java进程中的变量,并能方便的加线程锁控制线程的运转同步。在

3、PHP中ID全局存储没问题,可以放在session中,大不了放在文件中,但进程间同步就是问题了。实际上进程调度、管理是操作系统内核必须实现的功能,今天介绍的信号量(也称为信号灯)就是在Unix/Linux上解决进程同步的一项技术。信号灯原是用在铁路上的管理机制,我们今天看到的铁路大多是双线并行,但有的路段受山势、地形影响只有单条铁轨,必须保证同一时间只能有一列火车运行通过这些路段。早先铁路上就是用信号灯来管理的:没有火车经过时,信号等处于闲置状态,一旦有火车进入此路段,信号灯即变为在用状态,其他的火车经过时就需要等待,

4、等待先前的火车驶出路段信号等变为闲置后,才能进入此路段,一旦又有火车进入,信号灯又变为繁忙......,以此来保障铁路运行的安全畅通。Unix系统就像铁路管理局控制信号灯一样管理控制信号量的状态,因此也可以这样说信号量是由内核管理的,信号量不仅能控制进程间的同步,同样可以控制线程间的同步。信号量属于系统进程间通讯技术(IPC),今天我们只从PHP角度介绍信号量的使用,有关IPC的技术细节可参考Stevens的权威著作《UNIX网络编程第二卷进程间通信》。先看最终的代码:复制代码代码如下:

5、------------------------------------------//递增序列号ID(1~1000000000)////ID存储在共享内存中(sharedmemory),通过信号灯(semaphore)同步//---------------------------------------------------$IPC_KEY=0x1234;//SystemVIPCKEY$SEQ_KEY="SEQ";//共享内存中存储序列号ID的KEY//创建或获得一个现有的,以"1234"为KEY的信号量$sem_

6、id=sem_get($IPC_KEY);//创建或关联一个现有的,以"1234"为KEY的共享内存$shm_id=shm_attach($IPC_KEY,64);//占有信号量,相当于上锁,同一时间内只有一个流程运行此段代码sem_acquire($sem_id);//从共享内存中获得序列号ID$id=@shm_get_var($shm_id,$SEQ_KEY);if($id==NULL

7、

8、$id>=1000000000){$id=1;}else{$id++;}//将"++"后的ID写入共享内存shm_put_var

9、($shm_id,$SEQ_KEY,$id);//释放信号量,相当于解锁sem_release($sem_id);//关闭共享内存关联shm_detach($shm_id);echo"序列号ID:{$id}";?>009行,定义了一个16进制的整形KEY,在PHP中只支持SystemV的IPC机制,需要通过一个KEY关联到指定的资源(消息队列、信号量、共享内存)。010行,定义了一个在共享内存中存储递增ID的KEY,这是PHP对SystemV共享内存的闲置:需要通过类似hashtable的KEY-VALUE方式存储变量

10、。在上面的代码中使用共享内存做ID的存储容器,也可以换为Session、文件等其他机制,本文重点是信号量,有关共享内存的知识以后在讲(别忘了前面推荐的那本书)。013行,获得系统中的以1234为KEY的信号量,如果系统中没有就创建一个。015行,同13行相似,获得系统中的以1234为KEY的共享内存,如果系统中没有就创建一个,第二

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。