>  기사  >  백엔드 개발  >  동시성 문제를 해결하기 위한 PHP의 여러 구현

동시성 문제를 해결하기 위한 PHP의 여러 구현

不言
不言원래의
2018-04-19 15:06:002517검색

이 기사에서는 동시성 문제를 해결하기 위한 여러 가지 PHP 구현을 소개합니다. 이제는 특정 참조 가치가 있습니다. 필요한 친구가 참조할 수 있습니다.

제품 급증과 같은 동시성 시나리오에서는 이 시간이 지나면 동시성으로 인해 발생하는 문제를 해결해야 합니다. PHP 언어에는 기본 동시성 솔루션이 없으므로 동시성 제어를 달성하려면 다른 방법을 사용해야 합니다.

옵션 1: 파일 잠금 전용 잠금 사용

flock 함수는 파일 잠금을 획득하는 데 사용됩니다. 이 잠금은 동시에 하나의 스레드에서만 획득할 수 있습니다. 잠금을 획득하지 못한 다른 스레드는 차단되거나 획득됩니다. 실패

획득 후 잠금에 도달하면 먼저 인벤토리를 쿼리합니다. 인벤토리가 0보다 크면 주문하고 인벤토리를 줄인 다음 잠금을 해제합니다


옵션 2: 제공된 비관적 잠금을 사용합니다. Mysql 데이터베이스

Innodb 스토리지 엔진은 행 수준 잠금을 지원합니다. 데이터 행이 잠기면 다른 프로세스가 이 데이터 행에서 작동할 수 없습니다.

첫 번째 쿼리 및 행 잠그기: ID=1인 테이블에서 stock_num을 선택하세요. update

if(stock_num > 0){
//下订单
update table set stock_num=stock-1 where id=1
}

옵션 3: 대기열을 사용

하여 사용자 데이터 다운로드 단일 요청은 차례로 대기열에 저장되고 백그라운드에서 별도의 프로세스가 대기열의 주문 요청을 처리하는 데 사용됩니다


옵션 4: Redis 사용

Redis 작업은 모두 원자적이며 상품 재고를 저장할 수 있습니다. Redis에서는 주문을 하기 전에 재고에 대해 감소 작업이 수행됩니다. 반환된 값이 0보다 크거나 같으면 주문이 가능합니다. 그렇지 않으면 주문을 할 수 없습니다.

if(redis->get('stock_num') > 0){
 stock_num = redis->decr('stock_num')
 if(stock_num >= 0){
 //下订单
 }else{
 //库存不足
 }
}else{
//库存不足
}


기타 동시성 문제:

실제 응용 프로그램에서는 캐시가 실패하면 데이터가 캐시에 저장됩니다. 이때 동시성이 크면 많은 프로세스가 동시에 데이터를 가져오므로 많은 요청이 데이터베이스에 침투하게 됩니다. 데이터베이스가 충돌하면 파일 잠금을 사용하여 여기서 문제를 해결할 수 있습니다



[php]
view plain

copy


$data = $cache->get('key');  
if(!$data){  
    $fp = fopen('lockfile');  
    if(flock($fp, LOCK_EX)){  
        $data = $cache->get('key');//拿到锁后再次检查缓存,这时可能已经有了  
        if(!$data){  
            $data = mysql->query();  
            $cache->set('key', $data);  
        }  
        flock($fp, LOCK_UN);  
    }  
    fclose($fp);  
}

에게 간단히 말해서, 동시성 문제를 해결하려면 잠금이 필요합니다. 다양한 솔루션의 핵심은 잠금입니다


관련 권장 사항:

php는 대용량 데이터 게시 시 손실 문제를 해결합니다.

PHP는 세션 파일 차단을 해결합니다

PHP는 JSON 중국어 표시 문제를 해결합니다

위 내용은 동시성 문제를 해결하기 위한 PHP의 여러 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.