이 문서의 예제에서는 PHP 개발의 동시성 문제를 해결하기 위한 여러 구현 방법을 설명합니다. 참고하실 수 있도록 자세한 내용은 다음과 같습니다.
제품 성급한 구매와 같은 동시 시나리오에서는 과매도가 발생할 수 있습니다. 이때 동시성으로 인해 발생하는 이러한 문제를 해결해야 합니다
PHP 언어에는 기본 동시성 솔루션이 없으므로 동시성 제어를 달성하려면 다른 방법이 필요합니다.
옵션 1: 파일 잠금 전용 잠금 사용(권장 학습: PHP 비디오 튜토리얼)
flock 함수는 파일 잠금을 획득하는 데 사용됩니다. 이 잠금은 동시에 하나의 스레드에서만 획득할 수 있습니다. 다른 잠금을 획득한 경우 스레드가 차단되었거나 획득에 실패합니다
잠금 획득 시 먼저 인벤토리를 쿼리하여 0보다 크면 주문하고 인벤토리를 줄인 다음 잠금을 해제하세요
옵션 2: Mysql 데이터베이스 잠금에서 제공하는 비관적 사용
Innodb 스토리지 엔진은 행 수준 잠금을 지원합니다. 데이터 행이 잠겨 있으면 다른 프로세스가 데이터 행에서 작동할 수 없습니다.
먼저 행을 쿼리하고 잠급니다.
select stock_num from table where id=1 for 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{ //库存不足 }
기타 동시성 문제:
실제로 애플리케이션에서는 캐시가 실패하면 데이터가 캐시에 저장됩니다. 이때 동시성이 크면 많은 프로세스가 동시에 데이터를 가져오기 위해 데이터베이스로 이동하게 되어 많은 요청이 발생하게 됩니다.
데이터베이스에 침투하여 오류가 발생합니다. 파일 잠금을 사용하면 이 문제를 해결할 수 있습니다
$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 중국어 웹사이트의 기타 관련 기사를 참조하세요!