어떻게 PHP 로 다 중 스 레 드 프로 그래 밍 을 실현 합 니까?
스 레 드
먼저 스 레 드 를 말씀 드 리 겠 습 니 다.
스 레 드(thread)는 운영 체제 가 연산 스케줄 을 할 수 있 는 가장 작은 단위 이다.그것 은 프로 세 스 에 포함 되 어 있 으 며 프로 세 스 의 실제 운영 단위 입 니 다.하나의 스 레 드 는 프로 세 스 의 단일 순서 로 흐름 을 제어 하 는 것 을 말 합 니 다.한 프로 세 스 에서 여러 스 레 드 를 병행 할 수 있 고 모든 스 레 드 는 서로 다른 작업 을 병행 할 수 있 습 니 다.
다 중 스 레 드 를 사용 하 는 것 은 주로 실행 효율 에 있어 서 매우 큰 장점 을 가지 기 때문이다.스 레 드 는 운영 체제 가 스케줄 링 을 할 수 있 는 가장 작은 단위 이기 때문이다.
다 중 스 레 드 의 최적화 가 매우 많 지만 뇌 가 없 는 다 중 스 레 드 를 사용 하면 프로그램의 집행 효율 을 향상 시 킬 수 없다.스 레 드 의 생 성과 소각,문맥 전환,스 레 드 동기 화 등 도 성능 손실 이 있 기 때문에 순서대로 실행 하 는 코드 보다 시간 이 더 많이 걸 릴 수 있다.예:
sumSmall 은 1 누적 에서 50000 까지 의 함수 입 니 다.
위의 그림 은 메 인 스 레 드 에서 세 번 의 sumSmall 과 세 개의 스 레 드 를 각각 sumSmall 로 실행 한 다음 에 결 과 를 한 스 레 드 로 동기 화 하 는 시간 을 비교 하면 우 리 는 메 인 스 레 드 에서 만 실행 하 는 시간 이 오히려 더 짧 고 세 개의 스 레 드 생 성,전환,동기 화 시간 이 스 레 드 비동기 실행 보다 훨씬 절약 하 는 시간 을 발견 할 수 있다.
한편,함수 sum Large 는 1 에서 5000000 까지 누적 되 고 다음 그림 은 같은 스 레 드 에서 세 번 과 세 개의 스 레 드 를 실행 하 는 데 걸 리 는 시간 입 니 다.
이번에 다 중 스 레 드 가 마침내 효율 적 인 우 위 를 가지 게 되 었 다.
다 중 스 레 드 를 사용 할 지 여 부 는 구체 적 인 수요 에 따라 정 해 야 하 며 일반적으로 다음 과 같은 두 가지 상황 을 고려 해 야 한다.
PHP 는 기본적으로 다 중 스 레 드 를 지원 하지 않 습 니 다.다 중 스 레 드 확장 을 사용 하려 면 pthread 확장 을 설치 해 야 합 니 다.pthread 확장 을 설치 하려 면--enable-maintainer-zts 매개 변 수 를 사용 하여 PHP 를 다시 컴 파일 해 야 합 니 다.이 매개 변 수 는 PHP 를 컴 파일 할 때 스 레 드 보안 방식 을 사용 해 야 합 니 다.
스 레 드 보안
다 중 스 레 드 는 프로그램 을 불안 하 게 만 드 는 요소 입 니 다.다 중 스 레 드 를 사용 하기 전에 먼저 스 레 드 안전 문 제 를 고려 해 야 합 니 다.
스 레 드 안전:스 레 드 안전 은 프로 그래 밍 에서 의 용어 로 특정한 함수,함수 라 이브 러 리 가 다 중 스 레 드 환경 에서 호출 될 때 여러 스 레 드 간 의 공유 변 수 를 정확하게 처리 하여 프로그램 기능 을 정확하게 완성 할 수 있 습 니 다.
전통 적 인 다 중 스 레 드 에서 여러 스 레 드 가 변 수 를 공유 하기 때문에 다음 과 같은 문제 가 발생 할 수 있 습 니 다.
1.전역 배열$arr=array('a')가 존재 합 니 다.
2.A 스 레 드 에서 배열 의 길 이 를 1 로 가 져 옵 니 다.
3.B 스 레 드 에서 배열 의 길 이 를 1 로 가 져 옵 니 다.
4.A 스 레 드 pop 에서 배열 요소$a=arraypop($arr); $a = 'a';;
5.B 스 레 드 도 pop 배열 요소$b=arraypop($arr); $a = null;;
6.이때 B 스 레 드 에 이상 한 사건 이 발생 했 습 니 다.배열 의 길이 가 0 보다 크 거나 pop 에서 물건 이 나 오지 않 았 습 니 다.
PHP 구현
PHP 가 실현 하 는 스 레 드 보안 은 주로 TSRM 체 제 를 사용 하여 전체 변수 와 정적 변 수 를 격 리 시 켰 고 전체 변수 와 정적 변 수 를 모든 스 레 드 에 복사 했다.각 스 레 드 는 모두 메 인 스 레 드 의 백업 을 사용 하여 변수 충돌 을 피 했 고 스 레 드 안전 문제 가 발생 하지 않 았 다.
PHP 는 다 중 스 레 드 에 대한 패 키 징 으로 스 레 드 안전 을 보장 합 니 다.프로그래머 는 전체 변수 에 각종 자 물 쇠 를 추가 하여 읽 기와 쓰기 충돌 을 피 하 는 동시에 오류 의 기 회 를 줄 이 고 쓴 코드 가 더욱 안전 합 니 다.
그러나 이 로 인해 서브 스 레 드 가 실행 되 기 시작 하면 메 인 스 레 드 의 운행 디 테 일 을 조정 할 수 없고 스 레 드 는 어느 정도 에 스 레 드 간 에 전체 변 수 를 통 해 메 시 지 를 전달 하 는 능력 을 잃 었 다.
또한 PHP 가 스 레 드 보안 옵션 을 켜 면 TSRM 메커니즘 을 사용 하여 변 수 를 할당 하고 사용 할 때 추가 손실 이 발생 하기 때문에 다 중 스 레 드 가 필요 없 는 PHP 환경 에서 PHP 의 ZTS(비 스 레 드 보안)버 전 을 사용 하면 됩 니 다.
유형 과 방법
PHP 는 스 레 드 를 Thread 클래스 로 봉 인 했 습 니 다.스 레 드 의 생 성 은 하나의 스 레 드 대상 을 예화 하여 이 루어 집 니 다.클래스 의 패 키 징 성 으로 인해 변수의 사용 은 구조 함수 로 만 들 어 갈 수 있 고 스 레 드 연산 결 과 는 클래스 변 수 를 통 해 전달 되 어야 합 니 다.
다음은 자주 사용 하 는 Thread 클래스 방법 을 소개 합 니 다.
Pool
클래스 는 다 중 스 레 드 배분 관리 클래스 로 더 이상 소개 하지 않 습 니 다.인 스 턴 스 코드
다음은 인 터 페 이 스 를 요청 하 는 스 레 드 클래스 입 니 다.다음은 두 개의 다 중 스 레 드 의 응용 인 스 턴 스 를 작성 합 니 다.
class Request extends Thread {
public $url;
public $response;
public function __construct($url) {
$this->url = $url;
}
public function run() {
$this->response = file_get_contents($this->url);
}
}
비동기 요청동기 화 요청 을 여러 스 레 드 비동기 호출 로 나 누 어 프로그램의 운행 효율 을 향상 시 킵 니 다.
$chG = new Request("www.google.com");
$chB = new Request("www.baidu.com");
$chG ->start();
$chB ->start();
$chG->join();
$chB->join();
$gl = $chG->response;
$bd = $chB->response;
시간 초과 제어우연히 회사 사이트 의 한 홈 페이지 에 있 는 내용 을 발 견 했 을 때 가끔 없 었 고 구체 적 인 실현 을 몰 랐 다.그러나 이것 은 나 에 게 다 중 스 레 드 를 사용 하 는 영감 을 주 었 다.스 레 드 이 보 를 이용 하여 빠 른 실패 와 시간 초과 통 제 를 실현 했다.
우리 가 curl 을 사용 하여 어떤 주 소 를 요청 할 때 CURLOPT 를 통 해CONNECTTIMEOUT / CURLOPT_TIMEOUT 매개 변 수 는 각각 curl 의 연결 시간 초과 와 데이터 읽 기 시간 초 과 를 설정 하지만 전체 시간 초과 가 제어 되 지 않 습 니 다.또한 데이터 베 이 스 를 조회 할 때 시간 초과 설정 을 할 수 없습니다(새 고 블 로그:MySQL 에 조회 시간 초과 설정).
이 때 우 리 는 다 중 스 레 드 를 빌려 이 기능 을 실현 할 수 있 습 니 다.스 레 드 류 의 start()방법 을 실행 한 후에 join()방법 을 사용 하지 않 고 스 레 드 를 비동기 상태 에 있 게 하고 메 인 스 레 드 의 실행 을 막 지 않 습 니 다.
이때 메 인 스 레 드 는 플래그 십 에 해당 하 며,각 서브 스 레 드 는 순항 함 에 해당 하 며,플래그 십 이 어 딘 가 에 도착 한 후 순항 함 도 돌아 오 기 를 기다 릴 필요 가 없 으 며,일정 시간 을 기 다 렸 다가 떠 나 면 돼 순항 함 이 예상 치 못 할 때 플래그 십 이 하 얗 게 비어 있 는 등 을 피 할 수 있다.
코드:
$chG = new Request("www.google.com");
$chB = new Request("www.baidu.com");
$chG->start();
$chB->start();
$chB->join();
// chG join
sleep(1); // sleep
$gl = $chG->response;
$bd = $chB->response;
$bd->kill();
if (!$gl) {
$gl = ""; // , $gl
}
총결산PHP 가 다 중 스 레 드 에 대한 봉(yan)장 착(ge)은 스 레 드 를 사용 하 는 것 이 매우 불쾌 합 니 다.안전 하고 PHP 가 간단 하고 사용 하기 쉬 운 일 관 된 스타일 을 유지 하지만 다 중 스 레 드 능력 을 완전히 발휘 할 수 는 없다.
이상 은 어떻게 PHP 로 다 중 스 레 드 프로 그래 밍 을 실현 하 는 지 에 대한 상세 한 내용 입 니 다.더 많은 PHP 로 다 중 스 레 드 프로 그래 밍 을 실현 하 는 데 관 한 자 료 는 우리 의 다른 관련 글 에 관심 을 가 져 주 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Laravel - 변환된 유효성 검사 규칙으로 API 요청 제공동적 콘텐츠를 위해 API를 통해 Laravel CMS에 연결하는 모바일 앱(또는 웹사이트) 구축을 고려하십시오. 이제 앱은 CMS에서 번역된 콘텐츠를 받을 것으로 예상되는 다국어 앱이 될 수 있습니다. 일반적으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.