>  기사  >  백엔드 개발  >  PHP7.0에서 논블로킹 IO 구현 방법은 무엇입니까?

PHP7.0에서 논블로킹 IO 구현 방법은 무엇입니까?

王林
王林원래의
2023-05-26 08:51:291245검색

PHP7.0은 웹 개발 및 서버 측 개발에 널리 사용되는 인기 있는 프로그래밍 언어입니다. 중요한 업데이트 중 하나는 비차단 I/O의 도입입니다. 비차단 I/O는 현재 스레드를 차단하지 않고 여러 I/O 작업을 동시에 처리할 수 있는 비동기 프로그래밍 기술입니다. 이 기술은 동시성 성능과 응답성을 크게 향상시킵니다. 이 기사에서는 PHP7.0의 비차단 I/O 구현을 소개합니다.

  1. Stream Select

Stream Select는 PHP7.0에서 가장 간단한 비차단 I/O 구현 중 하나입니다. 이 메서드는 select 시스템 호출을 사용하여 모든 파일 스트림(열린 파일 핸들, 소켓 등을 참조하는 스트림)에 읽을 수 있는 데이터가 있는지 확인하고, 있으면 데이터를 읽습니다. 이 프로세스는 비차단 프로세스이므로 현재 프로세스를 차단하지 않습니다.

Stream Select를 사용하는 코드는 다음과 같습니다.

$read = array($fp);
$write = array();
$except = array();
if (false === ($num_changed_streams = stream_select($read, $write, $except, 0))) {
    die('Error Occured');
} elseif ($num_changed_streams > 0) {
    //有数据可读
    $data = fread($fp, $buffer_size);
} else {
    //无数据可读
}

위 코드는 먼저 stream_select 함수를 사용하여 읽을 수 있는 데이터가 있는지 확인하고, 있으면 데이터를 읽어옵니다. 이 확인 프로세스는 비차단이므로 현재 프로세스를 차단하지 않습니다.

  1. Event Loop

Event Loop는 PHP7.0에서 일반적으로 사용되는 또 다른 비차단 I/O 구현입니다. 이벤트 루프는 이벤트가 발생할 때 호출되는 이벤트 콜백 함수를 등록하여 비차단 I/O 작업을 구현합니다. 이벤트 루프에서 애플리케이션은 이벤트를 추가하고 이벤트 루프를 시작하여 I/O 작업을 처리합니다. 예를 들어 웹 개발에서는 이벤트 루프를 사용하여 HTTP 요청을 처리할 수 있습니다.

다음은 이벤트 루프를 사용하여 HTTP 요청을 처리하는 예입니다.

$loop = ReactEventLoopFactory::create();
$client = new ReactHttpClientClient($loop);

$request = $client->request('GET', 'http://www.example.com/');
$request->on('response', function ($response) {
    $response->on('data', function ($chunk) {
        echo $chunk;
    });
});
$request->end();

$loop->run();

위 예에서는 ReactPHP 기반의 이벤트 루프 객체 $loop가 먼저 생성된 다음 HTTP 클라이언트 $client가 생성되고 GET 요청이 발생합니다. 시작됩니다. 요청 응답의 콜백 함수에서 echo를 사용하여 수신된 데이터를 출력합니다.

  1. Coroutine

Coroutine은 PHP7.0에 도입된 또 다른 비차단 I/O 구현입니다. 코루틴은 코루틴의 특성을 활용하여 I/O 작업을 처리할 때 현재 코루틴을 일시 중지하고 다른 코루틴을 실행합니다. I/O 작업이 완료되면 코루틴은 실행을 재개하고 다음 코드를 계속 실행할 수 있습니다. 이 프로세스는 비차단 방식입니다.

다음은 코루틴을 사용하여 I/O 작업을 처리하는 예입니다.

$server = new SwooleServer("127.0.0.1", 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP);

$server->on('Receive', function ($serv, $fd, $from_id, $data) {
    $result = "";
    $fp = stream_socket_client("tcp://127.0.0.1:80", $errno, $errstr, 30);
    fwrite($fp, $data);
    while (!feof($fp)) {
        $result .= fgets($fp, 1024);
    }
    fclose($fp);
    swoole_coroutine::sleep(0.1);
    $serv->send($fd, $result);
});

$server->start();

위 코드에서 먼저 Swoole 확장을 사용하여 TCP 서버 개체 $server를 만듭니다. 클라이언트 데이터를 수신하는 콜백 함수에서 stream_socket_client 함수를 사용하여 HTTP 요청을 시작하고 while 루프를 사용하여 응답 데이터를 읽습니다. 데이터를 읽는 동안 swoole_coroutine::sleep(0.1)을 사용하여 현재 코루틴의 실행을 일시 중지하고 다른 코루틴의 실행을 기다립니다. 응답 데이터를 성공적으로 읽으면 데이터가 클라이언트로 다시 전송됩니다.

결론

PHP7.0은 스트림 선택, 이벤트 루프, 코루틴 등을 포함한 다양한 비차단 I/O 구현 방법을 도입합니다. 이러한 기술을 통해 PHP 애플리케이션은 여러 I/O 작업을 동시에 처리하여 동시성 성능과 응답 속도를 향상시킬 수 있습니다. ReactPHP 및 Swoole과 같은 많은 PHP 프레임워크 및 라이브러리는 개발자가 고성능 웹 애플리케이션을 작성할 수 있도록 이러한 비차단 I/O 기술을 통합했습니다.

위 내용은 PHP7.0에서 논블로킹 IO 구현 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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