memcached.php 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. <?php
  2. namespace Yurun\Until\Lock;
  3. require_once dirname(dirname(__DIR__)) . '/vendor/autoload.php';
  4. function canTest($type)
  5. {
  6. return !is_file($type . 'test.memcached') || file_get_contents($type . 'test.memcached') < 10;
  7. }
  8. function test($type)
  9. {
  10. usleep(mt_rand(10, 500) * 1000); // 延迟时间随机,模拟更新token时的网络响应时间
  11. if(is_file($type . 'test.memcached'))
  12. {
  13. file_put_contents($type . 'test.memcached', file_get_contents($type . 'test.memcached') + 1);
  14. }
  15. else
  16. {
  17. file_put_contents($type . 'test.memcached', '1');
  18. }
  19. }
  20. // 测试结果为文件中内容为10为正确
  21. // 并发测试-传统加锁(test.memcached)
  22. $lock2 = new \Yurun\Until\Lock\Memcached('test2');
  23. if(canTest(''))
  24. {
  25. if(LockConst::LOCK_RESULT_SUCCESS === $lock2->lock())
  26. {
  27. test('');
  28. $lock2->unlock();
  29. }
  30. }
  31. // 并发测试-并发判断回调(callbacktest.memcached)
  32. $lock1 = new \Yurun\Until\Lock\Memcached('test1');
  33. $result = $lock1->lock(
  34. function(){
  35. // 加锁后处理的任务
  36. test('callback');
  37. },
  38. function(){
  39. // 判断是否其它并发已经处理过任务
  40. return !canTest('callback');
  41. }
  42. );
  43. switch($result)
  44. {
  45. case LockConst::LOCK_RESULT_CONCURRENT_COMPLETE:
  46. // 其它请求已处理
  47. break;
  48. case LockConst::LOCK_RESULT_CONCURRENT_UNTREATED:
  49. // 在当前请求处理
  50. break;
  51. case LockConst::LOCK_RESULT_FAIL:
  52. echo '获取锁失败', PHP_EOL;
  53. break;
  54. }