2017-02-18 29 views
0

У меня очень странная проблема с использованием memcache, php, locks и одновременных запросов. Пожалуйста, обратите внимание на основные функции:транзакции memcache и согласованность

class memcachedata { 

public function getdata($key,$params) { 
     $timeout = 3600; 
     $mem = $this->memcache; 
     $expiry = $mem->get(md5($key.$params.'_lock')); 
     $this->log('GET EXPIRY'); 
     if ($expiry) { 
      $data = $mem->get(md5($key)); 
      $this->log('DATA GET'); 
     } else 
     { 
      $this->log('SET LOCK'); 
     $mem->set(md5($key.$params.'_lock'),'locked',$timeout); 
      $data = $this->calculate_external_data($key,$params);//curl here 
      if ($data) { 
       $mem->set(md5($key.$params),$data,$timeout); 
       $this->log('DATA UPDATED'); 
       } 
     } 
    return $data; 
} 
} 

DEBUG INFO:

00:00:00 GET EXPIRY 
00:00:00 GET DATA 
00:00:00 GET EXPIRY 
00:00:00 SET LOCK 
00:00:00 DATA UPDATED 
00:00:01 GET EXPIRY 
00:00:01 GET DATA 

Это правильный результат.

Проблема заключается в том, когда эта функция вызывается несколько раз из других функций или несколькими пользователями в одном (или) отдельной сессии, как:

function getuserinfo($username,$message){ 
return $this->getdata('users',"'$username','$message'"); 
} 

DEBUG INFO:

00:00:00 GET EXPIRY 
00:00:00 SET LOCK 
00:00:00 DATA UPDATED 
00:00:00 GET EXPIRY 
00:00:00 SET LOCK 
00:00:00 DATA UPDATED 
00:00:03 GET EXPIRY 
00:00:03 SET LOCK 
00:00:03 DATA UPDATED 

Почему функция GetData не видит замок? Пришло время начать использовать MQ?

ответ

0

Он был с php7.0 и использовал старое расширение memcache. Перемещение в memcached решило эту проблему. Как? Я не знаю.