현대의 높은 동시성 시나리오에서, 전통적인 동기 스크립팅 언어로서 PHP는 종종 다중 스레딩에 대한 지원에 대한 비판이 Java 또는 Go와 같은 언어만큼 좋지 않습니다. 그러나 "Thread_Safe"( Thread_Safe ) 관련 기능 및 메커니즘의 합리적인 사용은 기술 스택을 변경하지 않고도 PHP API의 동시 처리 기능을 크게 향상시킬 수 있습니다.
Thread_safe는 일반적으로 기능 또는 모듈이 다중 스레드 환경에서 안전하게 호출 될 수 있는지 여부를 나타냅니다. PHP에서는 공식 Zend 엔진이 컴파일 시간에 ZTS (Zend Thread Safety) 모드를 활성화 할 수 있지만 스레드 안전을 진정으로 지원하는 PHP 응용 프로그램은 일반적으로 Swoole, PTHREADS (DISTREADS) 또는 병렬 연장과 같은 확장자 또는 비동기 프레임 워크를 사용합니다.
데이터베이스 연결 풀 재사용
공유 메모리 캐시 읽기
비동기 I/O 작동
동시 요청 처리
스레드 안전 기능을 통해 PHP의 동시 처리 능력을 향상시키는 방법을 설명하기 위해 Swoole 확장을 예로 들어 봅시다.
다음은 Swoole을 사용하여 높은 동시성 API 인터페이스를 구현하는 단순화 된 예입니다.
use Swoole\Http\Server;
use Swoole\Table;
$table = new Table(1024);
$table->column('count', Table::TYPE_INT);
$table->create();
$server = new Server("0.0.0.0", 9501);
$server->on("start", function ($server) {
echo "Swoole HTTP server started at http://127.0.0.1:9501\n";
});
$server->on("request", function ($request, $response) use ($table) {
$key = 'visit_count';
$table->incr($key, 'count', 1);
$response->header("Content-Type", "application/json");
$response->end(json_encode([
'message' => 'Welcome to thread-safe API!',
'visit_count' => $table->get($key)['count']
]));
});
$ table-> set ( 'visit_count', [ 'count'=> 0]);
$ server-> start ();
위의 코드에서 Swoole \ Table은 요청에 따라 데이터를 공유하기위한 스레드 안전 공유 메모리 구조를 제공합니다. $ 테이블 의 모든 작업은 레이스 조건을 피하는 원자 운영입니다. 이 방법은 특히 카운터, 캐시 적중 통계 및 기타 시나리오에 적합합니다.
스레드 안전 기능 설계를위한 핵심 사항
PHP에 스레드 안전 함수를 작성할 때는 다음과 같은 원칙을 따라야합니다.
글로벌 변수를 사용하지 마십시오
중요한 영역을 처리하려면 잠금 장치 (예 : Swoole \ Lock)를 사용하십시오.
데이터 공유 충돌을 피하기 위해 스레드 책임을 합리적으로 나눕니다
일부 파일 I/O 작업, CURL Global 설정 등과 같은 비 반복 기능에 대한 참조를 피하십시오.
외부 요청 스레딩 처리
API가 타사 서비스 호출과 같은 다른 인터페이스를 요청 해야하는 경우 Swoole의 Coroutine 클라이언트 또는 Guzzle+ Multithreading을 사용하여 비동기 비 블로킹 호출을 구현할 수 있습니다. 예를 들어:
go(function () {
$cli = new Swoole\Coroutine\Http\Client('m66.net', 80);
$cli->get('/api/data');
echo $cli->body;
});
이 접근법은 특히 여러 원격 서비스 응답을 처리 할 때 전통적인 동기화 File_Get_Contents () 또는 CURL보다 훨씬 효율적입니다.
요약
PHP는 다중 스레딩 용으로 설계되지 않았지만 Swoole 및 Parallel과 같은 확장자가 스레드 안전 작업을 지원하는 확장 기능을 갖추고 있지만 개발자는 여전히 동시에 매우 동시에 사용 가능한 API 서비스를 구축 할 수 있습니다. 특정 구현에서, 스레드-안전 데이터 구조, 비동기 I/O, 코 루틴 및 기타 수단을 사용하여 PHP는 대부분의 중간 크기의 높은 콘센트 시나리오에 유능할 수 있습니다.
스레드 안전은 대결성 "은 총알"이 아니지만 효율적인 PHP 서비스 아키텍처에서는 무시할 수없는 중요한 도구입니다. 적시에 소개하고 제대로 설계하면 PHP 서비스는 새로운 활력을 가져올 수 있습니다.
관련 태그:
API