2013-04-27 5 views
1

원자 단위로이 작업을 수행 할 수 있습니까?PHP APC가 원자 적으로 값을 가져오고 설정합니다.

$myvalue = apc_get("mykey"); 
apc_store("mykey",0); 
// log/deal with myvalue 

"mykey"는 다른 프로세스에서 자주 증가하고 있으며, 이들을 놓치고 싶지 않습니다.

+1

달성하려는 목표가 확실하지 않습니다. 항상 0으로 설정하려고합니다. 그렇다면 왜 그것을 저장 하는가? – Rob

답변

3

원하는 기능은 apc_cas()입니다. 'cas'는 '비교 및 교환'의 약자입니다. 캐시에서 값을 저장하지만 마지막으로 가져온 이후로 변경되지 않은 경우에만 캐시에 값을 저장합니다. 함수가 실패하면 캐시 된 값을 다시 페치하고 다시 저장하려고합니다. 이렇게하면 변경 내용을 건너 뛰지 않습니다.

카운터를 원자 적으로 증가 시키려고한다고 가정 해 봅시다. 이 기술은 다음과 같습니다 그냥 그렇게, APC는 이에 대한 전문 증가 기 및 decrementer을 제공 apc_inc()apc_dec()을 발생

apc_add('counter', 0); // set counter to zero, only if it does not already exist.  
$oldVar = apc_fetch('counter'); // get current counter 

// do whatever you need to do with the counter ... 

// ... when you are ready to increment it you can do this 
while (apc_cas('counter', $oldVar, intval($oldVar)+1) === false) { 
    // huh. Someone else must have updated the counter while we were busy. 
    // Fetch the current value, then try to increment it again. 
    $oldVar = apc_fetch('counter'); 
} 

.

Memcache에는 정수가 아닌 값에도 사용할 수있는 cas()이 있습니다.

+1

귀하의 대답은 오해의 소지가 있습니다. apc_cas는 정수 이외에는 작동하지 않습니다. – Stephen

+0

문서를 읽은 후에는 완전히 옳습니다. 나는 memcache의'cas()'함수를 생각하고 있었는데, 함수 서명이 조금 다르긴하지만 어떤 값이라도 좋다. 고정 포스트 ... – slashingweapon

+0

반전 투표 :-) – Stephen

관련 문제