discuz_process.php 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <?php
  2. /**
  3. * [Discuz!] (C)2001-2099 Comsenz Inc.
  4. * This is NOT a freeware, use is subject to license terms
  5. *
  6. * $Id: discuz_process.php 28412 2012-02-29 06:14:48Z cnteacher $
  7. */
  8. if(!defined('IN_DISCUZ')) {
  9. exit('Access Denied');
  10. }
  11. class discuz_process
  12. {
  13. public static function islocked($process, $ttl = 0) {
  14. $ttl = $ttl < 1 ? 600 : intval($ttl);
  15. return discuz_process::_status('get', $process) || discuz_process::_find($process, $ttl);
  16. }
  17. public static function unlock($process) {
  18. discuz_process::_status('rm', $process);
  19. discuz_process::_cmd('rm', $process);
  20. }
  21. private static function _status($action, $process) {
  22. static $plist = array();
  23. switch ($action) {
  24. case 'set' : $plist[$process] = true; break;
  25. case 'get' : return !empty($plist[$process]); break;
  26. case 'rm' : $plist[$process] = null; break;
  27. case 'clear' : $plist = array(); break;
  28. }
  29. return true;
  30. }
  31. private static function _find($name, $ttl) {
  32. if(!discuz_process::_cmd('get', $name)) {
  33. discuz_process::_cmd('set', $name, $ttl);
  34. $ret = false;
  35. } else {
  36. $ret = true;
  37. }
  38. discuz_process::_status('set', $name);
  39. return $ret;
  40. }
  41. private static function _cmd($cmd, $name, $ttl = 0) {
  42. static $allowmem;
  43. if($allowmem === null) {
  44. $mc = memory('check');
  45. $allowmem = $mc == 'memcache' || $mc == 'redis';
  46. }
  47. if($allowmem) {
  48. return discuz_process::_process_cmd_memory($cmd, $name, $ttl);
  49. } else {
  50. return discuz_process::_process_cmd_db($cmd, $name, $ttl);
  51. }
  52. }
  53. private static function _process_cmd_memory($cmd, $name, $ttl = 0) {
  54. $ret = '';
  55. switch ($cmd) {
  56. case 'set' :
  57. $ret = memory('set', 'process_lock_'.$name, time(), $ttl);
  58. break;
  59. case 'get' :
  60. $ret = memory('get', 'process_lock_'.$name);
  61. break;
  62. case 'rm' :
  63. $ret = memory('rm', 'process_lock_'.$name);
  64. }
  65. return $ret;
  66. }
  67. private static function _process_cmd_db($cmd, $name, $ttl = 0) {
  68. $ret = '';
  69. switch ($cmd) {
  70. case 'set':
  71. $ret = C::t('common_process')->insert(array('processid' => $name, 'expiry' => time() + $ttl), FALSE, true);
  72. break;
  73. case 'get':
  74. $ret = C::t('common_process')->fetch($name);
  75. if(empty($ret) || $ret['expiry'] < time()) {
  76. $ret = false;
  77. } else {
  78. $ret = true;
  79. }
  80. break;
  81. case 'rm':
  82. $ret = C::t('common_process')->delete_process($name, time());
  83. break;
  84. }
  85. return $ret;
  86. }
  87. }
  88. ?>