Setting memcache keys in eval block

Markus Jelsma markus at buyways.nl
Wed Feb 10 13:18:01 MSK 2010


Hello,


Thanks for your reply. The manual indeed tells us to set it inside the block, 
which i am doing. However, the first result cannot be passed to the second 
eval block;

The following does not work; it sends the error message $memc_key variable is 
not set:

      eval $key
      {
        # Check if we got the token, a 160bit SHA1 hash
        if ($cookie_token ~* "([A-Za-z0-9]{40})")
        {
          # Attempt to retrieve the token from memcache
          set $memc_cmd 'get';
          set $memc_key $cookie_token;

          # Retrieve the token's value and store it in the local key variable
          memc_pass 127.0.0.1:11211;
        }
      }
      eval $email
      {
        set $memc_cmd 'get';
        set $memc_key $key;
        memc_pass 127.0.0.1:11211;
      }

      echo 'test';
      echo $email;
      echo_flush;

I really need two seperate gets. Nesting the  second eval in the first is also 
not allowed because then we have a duplicate memc_pass which it complains 
about.

For the moment i `solved` this issue by adding a second location which the 
first eval proxies to, this does work but shows up as a second HTTP request in 
the logs; this feels a bit slow and i really would like to handle this subject 
within one location directive.

To summarize the problem; using a variable set by eval in a subsequent eval 
block does not work. 

Some advice is much appreciated :)



Cheers,





The eval module's handler runs before the ngx_rewrite module. So make
sure you always "set" variables inside the eval block. The "set"
directives outside the eval block does not work because they run after
the "eval" block and hence the memcached handler complete.

IIRC, this was mentioned in the ngx_eval module's documentation.


Markus Jelsma - Technisch Architect - Buyways BV
http://www.linkedin.com/in/markus17
050-8536620 / 06-50258350




More information about the nginx mailing list