1+ --TEST--
2+ Test for GH #90
3+ --SKIPIF--
4+ <?php if (!extension_loaded ("memcached " )) print "skip " ; ?>
5+ --FILE--
6+ <?php
7+ //Setup MemcacheD
8+ {
9+ $ memcached = new Memcached ();
10+ $ memcached ->setOptions (array (memcached::OPT_BINARY_PROTOCOL => true ));
11+ $ memcached ->addServers (array (array ('127.0.0.1 ' , 11211 , 100 )));
12+ }
13+
14+ // Create a key for use as a lock. If this key already exists, wait till it doesn't exist.
15+ {
16+ $ key = 'LockKey ' ;
17+ $ lockToken = mt_rand (0 , pow (2 , 32 )); //Random value betwen 0 and 2^32 for ownership verification
18+
19+ while (true )
20+ {
21+ $ casToken = null ;
22+ $ data = $ memcached ->get ($ key , $ casToken );
23+ if ($ memcached ->getResultCode () == Memcached::RES_NOTFOUND )
24+ {
25+ if ($ memcached ->add ($ key , $ lockToken , 5 ))
26+ {
27+ break ;
28+ }
29+ }
30+ elseif ($ data === false )
31+ {
32+ if ($ memcached ->cas ($ casToken , $ key , $ lockToken , 5 ))
33+ {
34+ break ;
35+ }
36+ }
37+
38+ //Sleep 10 milliseconds
39+ usleep (10 * 1000 );
40+ }
41+ }
42+
43+ //Do something here that requires exclusive access to this key
44+
45+ //Effectively delete our key lock.
46+ {
47+ $ casToken = null ;
48+ if ($ lockToken == $ memcached ->get ($ key , $ casToken ))
49+ {
50+ $ memcached ->cas ($ casToken , $ key , false , 1 );
51+ }
52+ }
53+
54+ //Create 10 keys and then increment them. The first value returned will be wrong.
55+ {
56+ $ keyList = array ();
57+ for ($ i = 0 ; $ i < 10 ; $ i ++)
58+ {
59+ $ keyList [] = $ i . '_ ' . uniqid ('count_value_ ' );
60+ }
61+
62+ $ valueList = array ();
63+ foreach ($ keyList as $ key )
64+ {
65+ $ valueList [$ key ] = $ memcached ->increment ($ key , 1 , 1 );
66+ }
67+
68+ var_dump ($ valueList );
69+ }
70+
71+ --EXPECTF --
72+ array (10 ) {
73+ ["0_%s " ]=>
74+ int(1 )
75+ ["1_%s " ]=>
76+ int(1 )
77+ ["2_%s " ]=>
78+ int(1 )
79+ ["3_%s " ]=>
80+ int(1 )
81+ ["4_%s " ]=>
82+ int(1 )
83+ ["5_%s " ]=>
84+ int(1 )
85+ ["6_%s " ]=>
86+ int(1 )
87+ ["7_%s " ]=>
88+ int(1 )
89+ ["8_%s " ]=>
90+ int(1 )
91+ ["9_%s " ]=>
92+ int(1 )
93+ }
0 commit comments