PHP下通过系统信号量加锁方式获取递增序列ID.doc_第1页
PHP下通过系统信号量加锁方式获取递增序列ID.doc_第2页
PHP下通过系统信号量加锁方式获取递增序列ID.doc_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PHP下通过系统信号量加锁方式获取递增序列ID.txt求而不得,舍而不能,得而不惜,这是人最大的悲哀。付出真心才能得到真心,却也可能伤得彻底。保持距离也就能保护自己,却也注定永远寂寞。前一阵子,设计LAJP时需要在PHP中生成唯一ID,看似小菜一碟却着实让我为难了,在Java中一个同步方法即可搞定的事,但在PHP中却没有好的解决思路。-在网上搜了搜,有两个办法但都不太好:一个是简单的以进程ID+时间戳,或进程ID+随机数来产生近似的唯一ID,虽简单但对于追求“完美”的我不愿这样凑合,再说Apache2以后进程会维持相当长得时间,生成的ID发生碰撞的几率还是比较大的;第二个思路是通过Mysql的自增字段,这个就更不能考虑了,效率低不说,我的设计里压根就没数据库。递增ID的获取是个过程:1. 从全局某个存储中读取ID2. 给ID加13. 将ID重新存入全局存储在多进程或线程的程序中需要将上述3步作为单步的原子操作,才能保证ID的唯一。Java中很好解决,这是因为Java程序大多以多线程方式运行,每个线程都能共享Java进程中的变量,并能方便的加线程锁控制线程的运转同步。在PHP中ID全局存储没问题,可以放在session中,大不了放在文件中,但进程间同步就是问题了。实际上进程调度、管理是操作系统内核必须实现的功能,今天介绍的信号量(也称为信号灯)就是在Unix/Linux上解决进程同步的一项技术。信号灯原是用在铁路上的管理机制,我们今天看到的铁路大多是双线并行,但有的路段受山势、地形影响只有单条铁轨,必须保证同一时间只能有一列火车运行通过这些路段。早先铁路上就是用信号灯来管理的:没有火车经过时,信号等处于闲置状态,一旦有火车进入此路段,信号灯即变为在用状态,其他的火车经过时就需要等待,等待先前的火车驶出路段信号等变为闲置后,才能进入此路段,一旦又有火车进入,信号灯又变为繁忙.,以此来保障铁路运行的安全畅通。Unix系统就像铁路管理局控制信号灯一样管理控制信号量的状态,因此也可以这样说信号量是由内核管理的,信号量不仅能控制进程间的同步,同样可以控制线程间的同步。信号量属于系统进程间通讯技术(IPC),今天我们只从PHP角度介绍信号量的使用,有关IPC的技术细节可参考Stevens的权威著作UNIX网络编程第二卷 进程间通信。先看最终的代码:复制代码 代码如下:= 1000000000)$id = 1;else$id+;/将+后的ID写入共享内存shm_put_var($shm_id, $SEQ_KEY, $id);/释放信号量,相当于解锁sem_release($sem_id);/关闭共享内存关联shm_detach($shm_id);echo 序列号ID:$id;?009行,定义了一个16进制的整形KEY,在PHP中只支持System V的IPC机制,需要通过一个KEY关联到指定的资源(消息队列、信号量、共享内存)。010 行,定义了一个在共享内存中存储递增ID的KEY,这是PHP对System V共享内存的闲置:需要通过类似hashtable的KEY-VALUE方式存储变量。在上面的代码中使用共享内存做ID的存储容器,也可以换为 Session、文件等其他机制,本文重点是信号量,有关共享内存的知识以后在讲(别忘了前面推荐的那本书)。013行,获得系统中的以1234为KEY的信号量,如果系统中没有就创建一个。015行,同13行相似,获得系统中的以1234为KEY的共享内存,如果系统中没有就创建一个,第二个参数64表示创建64bytes大小的共享内存。018034 行,同步代码区,当一个进程或线程执行sem_acquire函数占有了信号量,到它调用sem_release函数释放信号量的过程内,其他进程或线程执行到sem_acquire会阻塞。021行从共享内存中获得ID,函数shm_get_var前缀是为了屏蔽出错信息(第一次执行时,共享内存中并没有以SEQ为KEY的数据,会在页面上打印警告信息)。其他语句非常简单,不需多讲。程序编好后,访问这个PHP页面,会递增的输出数字。我们可以通过系统命令ipcs查看在程序创建的信号量和共享内存:$ ipcs- Shared Memory Segments -key shmid owner perms bytes nattch status0x00001234 1212443 www-data 666 64 0- Semaphore Arrays -key semid owner perms nsems0x00001234 163841 www-data 666 3- Message Queues -key msqid owner perms used-bytes messages前两段分别是共享内存和信号量,0x00001234既是我们创建的KEY。也可以通过命令ipcrm删除:$ ipcrm -M 0x00001234 #删除共享内存$ ipcrm -S 0x00001234 #删除信号量-PHP手册中关于IPC的资料非常少,这点也不难想象,Stevens已经在十几年前讲得

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论