PHP 개발에서, 특히 많은 네트워크 요청 또는 데이터베이스 연결이 필요한 경우, 단일 스레드 동기화 작업은 종종 병목 현상이되어 프로그램의 전반적인 효율성에 영향을 미칩니다. 이 문제를 해결하기 위해 여러 연결 인스턴스를 만들고 병렬 처리를 활용하여 성능을 향상시킬 수 있습니다. 이 기사는 PHP의 Connect () 함수 예제를 결합하여 여러 인스턴스 연결을 구현하고 병렬 처리를 사용하여 작업 속도를 높이는 방법을 설명합니다.
기존의 PHP 코드는 종종 다음과 같이 동기식으로 실행됩니다.
<?php
function connect($url) {
// 시뮬레이션 요청
$content = file_get_contents($url);
return $content;
}
$urls = [
'http://example.com/api/1',
'http://example.com/api/2',
'http://example.com/api/3',
];
foreach ($urls as $url) {
$result = connect($url);
echo $result . "\n";
}
?>
위의 코드에서 각 요청은 마지막 완료를 기다려야하므로 비 효율성을 초래해야합니다. 각 요청이 1 초가 걸리면 세 가지 요청이 모두 완료 되려면 3 초가 걸립니다.
각 요청에 대해 독립적 인 연결 인스턴스를 만들 수 있습니다.
<?php
class Connector {
private $url;
public function __construct($url) {
$this->url = $url;
}
public function connect() {
return file_get_contents($this->url);
}
}
$urls = [
'http://m66.net/api/1',
'http://m66.net/api/2',
'http://m66.net/api/3',
];
$connectors = [];
foreach ($urls as $url) {
$connectors[] = new Connector($url);
}
이러한 방식으로 각 요청을 객체로 캡슐화하지만 여전히 요청을 동기화합니다.
PHP는 다음과 같은 병렬 처리를 구현하는 여러 가지 방법을 지원합니다.
curl_multi_* 일련의 함수를 사용하여 동시 요청을 수행하십시오.
멀티 스레딩 (예 : pthreads 확장)을 활용하십시오.
Reactphp 와 같은 비동기 라이브러리를 사용하십시오.
여기에서 Curl_multi는 여러 연결 인스턴스를 병렬로 처리하는 방법을 보여주기 위해 예제로 사용됩니다.
<?php
class Connector {
private $url;
private $ch;
public function __construct($url) {
$this->url = $url;
$this->ch = curl_init();
curl_setopt($this->ch, CURLOPT_URL, $this->url);
curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true);
}
public function getCurlHandle() {
return $this->ch;
}
public function getContent() {
return curl_multi_getcontent($this->ch);
}
}
<?php
$urls = [
'http://m66.net/api/1',
'http://m66.net/api/2',
'http://m66.net/api/3',
];
$connectors = [];
foreach ($urls as $url) {
$connectors[] = new Connector($url);
}
$multiHandle = curl_multi_init();
foreach ($connectors as $connector) {
curl_multi_add_handle($multiHandle, $connector->getCurlHandle());
}
$running = null;
do {
curl_multi_exec($multiHandle, $running);
curl_multi_select($multiHandle);
} while ($running > 0);
foreach ($connectors as $connector) {
$content = $connector->getContent();
echo $content . "\n";
curl_multi_remove_handle($multiHandle, $connector->getCurlHandle());
}
curl_multi_close($multiHandle);
CURL_MULTI를 통해 여러 HTTP 요청을 동시에 시작하여 모든 요청이 완료되기를 기다리고 한 번에 결과를 처리하여 대기 시간을 크게 절약 할 수 있습니다.
Connect () 함수를 사용하여 요청을 캡슐화하고 쉽게 관리 할 수 있도록 여러 연결 인스턴스를 만듭니다.
PHP의 CURL_MULTI 시리즈 기능을 사용하여 요청의 병렬 처리를 구현하십시오.
병렬 처리는 네트워크 요청 또는 연결의 효율성을 크게 향상시키고 여러 인터페이스에 동시에 액세스하는 시나리오에 적합합니다.