>

APC에서 변수를 업데이트하려고하는데,이를 시도하는 많은 프로세스가있을 것입니다.

APC는 잠금 기능을 제공하지 않으므로 다른 메커니즘 사용을 고려하고 있습니다 ... 지금까지 찾은 것은 mysql의 GET_LOCK () 및 php의 flock ()입니다. 고려해야 할 다른 것이 있습니까?

업데이트 : sem_acquire를 찾았지만 차단 잠금 인 것 같습니다.


  • 답변 # 1

    /*
    CLASS ExclusiveLock
    Description
    ==================================================================
    This is a pseudo implementation of mutex since php does not have
    any thread synchronization objects
    This class uses flock() as a base to provide locking functionality.
    Lock will be released in following cases
    1 - user calls unlock
    2 - when this lock object gets deleted
    3 - when request or script ends
    ==================================================================
    Usage:
    //get the lock
    $lock = new ExclusiveLock( "mylock" );
    //lock
    if( $lock->lock( ) == FALSE )
        error("Locking failed");
    //--
    //Do your work here
    //--
    //unlock
    $lock->unlock();
    ===================================================================
    */
    class ExclusiveLock
    {
        protected $key   = null;  //user given value
        protected $file  = null;  //resource to lock
        protected $own   = FALSE; //have we locked resource
        function __construct( $key ) 
        {
            $this->key = $key;
            //create a new resource or get exisitng with same key
            $this->file = fopen("$key.lockfile", 'w+');
        }
    
        function __destruct() 
        {
            if( $this->own == TRUE )
                $this->unlock( );
        }
    
        function lock( ) 
        {
            if( !flock($this->file, LOCK_EX | LOCK_NB)) 
            { //failed
                $key = $this->key;
                error_log("ExclusiveLock::acquire_lock FAILED to acquire lock [$key]");
                return FALSE;
            }
            ftruncate($this->file, 0); // truncate file
            //write something to just help debugging
            fwrite( $this->file, "Locked\n");
            fflush( $this->file );
            $this->own = TRUE;
            return TRUE; // success
        }
    
        function unlock( ) 
        {
            $key = $this->key;
            if( $this->own == TRUE ) 
            {
                if( !flock($this->file, LOCK_UN) )
                { //failed
                    error_log("ExclusiveLock::lock FAILED to release lock [$key]");
                    return FALSE;
                }
                ftruncate($this->file, 0); // truncate file
                //write something to just help debugging
                fwrite( $this->file, "Unlocked\n");
                fflush( $this->file );
                $this->own = FALSE;
            }
            else
            {
                error_log("ExclusiveLock::unlock called on [$key] but its not acquired by caller");
            }
            return TRUE; // success
        }
    };
    
    

  • 답변 # 2

    파일 시스템이나 mysql에 의존하지 않고 apc_add 함수를 사용하여이를 달성 할 수 있습니다. 와이즈 비즈  변수가 아직 저장되지 않은 경우에만 성공합니다. 따라서, 잠금 메커니즘을 제공한다. TTL을 사용하면 고정 된 잠금 장치가 잠금 장치를 계속 유지하지 않아도됩니다.

    apc_add 이유  올바른 해결책은 잠금 확인과 '잠금 설정'사이에 존재하는 경쟁 조건을 피하기 때문입니다. apc_add 이후  이미설정되지 않은 경우에만 값을 설정하고 (캐시에 "추가"), 시간의 근접성에 관계없이 한 번에 두 번의 호출로 잠금을 획득 할 수 없도록합니다.를 동시에 확인하지 않는 솔루션은 본질적으로이 경쟁 조건을 겪게됩니다. 경쟁 조건없이 성공적으로 잠 그려면 한 번의 원자 작업이 필요합니다.

    APC 잠금은 해당 PHP 실행 환경에서만 존재하므로 호스트 간 잠금을 지원하지 않기 때문에 일반 잠금에 가장 적합한 솔루션은 아닙니다. 와이즈 비즈  또한 원자 추가 기능을 제공하므로 호스트 간 잠금 방법 중 하나 인이 기술과 함께 사용할 수도 있습니다. 와이즈 비즈  또한 원자 적 'SETNX'기능 및 TTL을 지원하며 호스트 간의 잠금 및 동기화에 매우 일반적인 방법입니다. 그러나 OP는 특히 APC에 대한 솔루션을 요청합니다.

  • 답변 # 3

    잠금 시점에서 여러 프로세스가 빈 캐시 키를 채우지 못하게하려면 차단 잠금을 원하지 않는 이유는 무엇입니까?

    apc_add
    
    

    캐시가 좋으면 그냥 롤백하십시오. 캐시에 아무것도 없으면 잠금을 얻습니다. 잠금이 설정되면 잠금을 얻기 위해 대기하는 동안 캐시가 다시 채워지지 않았는지 캐시를 다시 확인해야합니다. 캐시가 다시 채워지면 해당 값을 사용하고 잠금을 해제하십시오. 그렇지 않으면 계산을 수행하고 캐시를 채우고 잠금을 해제하십시오.

  • 답변 # 4

    실제로 이것이 Peter의 것보다 잘 작동하는지 확인하십시오. 제안.

    http://us2.php.net/flock

    독점 잠금 장치를 사용하고 편안하게 사용하려면 파일을 잠 그려는 다른 모든 항목을 2-3 초 동안 잠자십시오. 올바르게 수행하면 사이트에 잠긴 리소스에 관한 중단이 발생하지만 동일한 것을 캐시하기 위해 싸우는 수많은 스크립트는 발생하지 않습니다.

  • 답변 # 5

    파일 시스템에 잠금을 설정하는 것이 마음에 들지 않으면 'x'모드의 fopen (). 예를 들면 다음과 같습니다.

    Memcache
    
    

    www.php.net/fopen 참조

    Redis

  • 이전 dataframe - 열에서 일치하는 경우 Python 링크 레코드
  • 다음 python - Visual Studio 코드가 디버거에서 Django 프로젝트를 시작할 수 없음