首页 > 开发 > PHP > 正文

php实现读取内存顺序号

2024-05-04 23:33:32
字体:
来源:转载
供稿:网友

这篇文章主要介绍了php实现读取内存顺序号,十分的简单实用,需要的朋友可以参考下

只是做记录,osc本站应该有重复的

semWrapper.class.php

 

 
  1. /* 
  2. * 信号量(Semaphore)。 
  3. * 这是一个包装类,用于解决不同平台下对“信号量”的不同实现方式。 
  4. * 目前这个类只是象征性的,在 Windows 平台下实际是空跑(并没有真的实现互斥)。 
  5. */ 
  6. class SemWrapper 
  7. private $hasSemSupport
  8. private $sem
  9. const SEM_KEY = 1; 
  10.  
  11. public function __construct() 
  12. $this->hasSemSupport = function_exists( 'sem_get' ); 
  13. if ( $this->hasSemSupport ) { 
  14. $this->sem = sem_get( self::SEM_KEY ); 
  15.  
  16. public function acquire() { 
  17. if ( $this->hasSemSupport ) { 
  18. return sem_acquire( $this->sem ); 
  19. return true; 
  20.  
  21. public function release() { 
  22. if ( $this->hasSemSupport ) { 
  23. return sem_release( $this->sem ); 
  24. return true; 

SeqGenerator.class.php

 

 
  1. /* 
  2. * 顺序号发生器。 
  3. */ 
  4. class SeqGenerator 
  5. const SHM_KEY = 1; 
  6.  
  7. /** 
  8. * 对顺序号发生器进行初始化。 
  9. * 仅在服务器启动后的第一次调用有效,此后再调用此方法没有实际作用。 
  10. * @param int $start 产生顺序号的起始值。 
  11. * @return boolean 返回 true 表示成功。 
  12. */ 
  13. static public function init( $start = 1 ) 
  14. // 通过信号量实现互斥,避免对共享内存的访问冲突 
  15. $sw = new SemWrapper; 
  16. if ( ! $sw->acquire() ) { 
  17. return false; 
  18.  
  19. // 打开共享内存 
  20. $shm_id = shmop_open( self::SHM_KEY, 'n', 0644, 4 ); 
  21. if ( emptyempty($shm_id) ) { 
  22. // 因使用了 'n' 模式,如果无法打开共享内存,可以认为该共享内存已经创建,无需再次初始化 
  23. $sw->release(); 
  24. return true; 
  25.  
  26. // 在共享内存中写入初始值 
  27. $size = shmop_write( $shm_id, pack( 'L'$start ), 0 ); 
  28. if ( $size != 4 ) { 
  29. shmop_close( $shm_id ); 
  30. $sw->release(); 
  31. return false; 
  32.  
  33. // 关闭共享内存,释放信号量 
  34. shmop_close( $shm_id ); 
  35. $sw->release(); 
  36. return true; 
  37.  
  38. /** 
  39. * 产生下一个顺序号。 
  40. * @return int 产生的顺序号 
  41. */ 
  42. static public function next() 
  43. // 通过信号量实现互斥,避免对共享内存的访问冲突 
  44. $sw = new SemWrapper; 
  45. if ( ! $sw->acquire() ) { 
  46. return 0; 
  47.  
  48. // 打开共享内存 
  49. $shm_id = shmop_open( self::SHM_KEY, 'w', 0, 0 ); 
  50. if ( emptyempty($shm_id) ) { 
  51. $sw->release(); 
  52. return 0; 
  53.  
  54. // 从共享内存中读出顺序号 
  55. $data = shmop_read( $shm_id, 0, 4 ); 
  56. if ( emptyempty($data) ) { 
  57. $sw->release(); 
  58. return 0; 
  59.  
  60. $arr = unpack( 'L'$data ); 
  61. $seq = $arr[1]; 
  62.  
  63. // 把下一个顺序号写入共享内存 
  64. $size = shmop_write( $shm_id, pack( 'L'$seq + 1 ), 0 ); 
  65. if ( $size != 4 ) { 
  66. $sw->release(); 
  67. return 0; 
  68.  
  69. // 关闭共享内存,释放信号量 
  70. shmop_close( $shm_id ); 
  71. $sw->release(); 
  72. return $seq

page.php

 

 
  1. //使用方法 
  2.  
  3. $seq = SeqGenerator::next(); 
  4.  
  5. var_dump($seq); 

以上所述就是本文的全部内容了,希望大家能够喜欢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表