>  기사  >  PHP 프레임워크  >  Swoole의 실제 작동: 코루틴을 사용하여 애플리케이션 성능을 향상시키는 방법

Swoole의 실제 작동: 코루틴을 사용하여 애플리케이션 성능을 향상시키는 방법

WBOY
WBOY원래의
2023-11-07 15:09:371032검색

Swoole의 실제 작동: 코루틴을 사용하여 애플리케이션 성능을 향상시키는 방법

Swoole 실행: 코루틴을 사용하여 애플리케이션 성능을 향상시키는 방법

인터넷 애플리케이션이 점점 더 복잡해짐에 따라 성능이 점점 더 중요한 문제가 되었습니다. 코루틴을 위한 고성능 네트워크 통신 프레임워크인 Swoole은 이 문제를 매우 잘 해결할 수 있습니다. 이 기사에서는 Swoole 코루틴의 몇 가지 기본 개념을 소개하고 코루틴을 사용하여 애플리케이션 성능을 향상시키는 방법을 보여주는 예제를 제공합니다.

1. 코루틴이란? 코루틴은 단일 스레드에서 다중 작업 공동 작업을 수행할 수 있고 코루틴 간에 자유롭게 전환할 수 있는 경량 스레드입니다. Swoole에서 코루틴은 비동기 프로그래밍의 복잡성을 단순화할 수 있으며, 동기 코드를 작성하는 것처럼 비동기 코드를 작성할 수 있어 코드의 가독성과 유지 관리성이 향상됩니다.

2. 코루틴의 기본 사용법

Swoole에서는 swoole_coroutine_create 함수를 통해 코루틴을 생성합니다.

//创建协程
$cid = swoole_coroutine_create(function(){
    echo "Hello Coroutine
";
});

//若主线程不阻塞,则协程无法执行

코루틴을 생성한 후 swoole_event_wait 함수를 사용하여 실행을 기다려야 합니다. 코드는 다음과 같습니다.

//创建协程
$cid = swoole_coroutine_create(function(){
    echo "Hello Coroutine
";
});

//等待协程执行
swoole_event_wait();

위 코드는 "Hello Coroutine"을 출력하여 코루틴이 성공적으로 실행되었음을 나타냅니다.

코루틴에서 swoole_coroutine_yield 함수를 사용하여 현재 코루틴을 포기하고 다른 코루틴이 실행되도록 할 수도 있습니다. 코드는 다음과 같습니다.

$cid1 = swoole_coroutine_create(function(){
    echo "Coroutine 1
";
    swoole_coroutine_yield();
    echo "Coroutine 1 resume
";
});

$cid2 = swoole_coroutine_create(function(){
    echo "Coroutine 2
";
    swoole_coroutine_yield();
    echo "Coroutine 2 resume
";
});

swoole_coroutine_resume($cid1);
swoole_coroutine_resume($cid2);
swoole_event_wait();

위 코드에서는 두 개의 코루틴이 먼저 생성된 다음 swoole_coroutine_resume 함수를 사용합니다. 두 코루틴을 병합하는 데 사용됩니다. 각 코루틴은 각각 실행을 재개합니다. swoole_coroutine_yield 함수는 코루틴에서 각각 "Coroutine 1"과 "Coroutine 2"를 출력한 다음 둘 다 실행을 일시 중지하고 CPU를 포기합니다. 마지막으로 코루틴이 한 주기를 완료한 후 CPU를 가져오고 각각 "Coroutine 1 이력서"와 "Coroutine 2 이력서"를 출력합니다.

3. 코루틴의 공통 기술

동시 작업 처리
  1. Swoole에서는 swoole_coroutine_wait 함수를 사용하여 여러 코루틴의 동시 실행 및 동기화를 구현할 수 있습니다.
$tasks = [
    "task1" => function () {
        sleep(1);
        return "Task 1 Done
";
    },
    "task2" => function () {
        sleep(1);
        return "Task 2 Done
";
    },
];

$results = [];

foreach ($tasks as $name => $task) {
    $cid = swoole_coroutine_create(function () use ($name, $task, &$results) {
        $result = $task();
        $results[$name] = $result;
    });
    swoole_coroutine_resume($cid);
}

swoole_coroutine_wait();
print_r($results);

위 코드에서. 먼저 두 개의 작업을 생성하고 작업 실행 시간을 시뮬레이션하기 위해 Sleep(1)을 추가한 다음 foreach 루프를 사용하여 두 개의 코루틴을 생성하고 실행 결과를 $results 배열에 저장합니다. 마지막으로 swoole_coroutine_wait 함수를 호출하여 코루틴이 완료되고 실행 결과를 얻습니다.

IO 작업 처리
  1. Swoole에서는 swoole_coroutine_system_exec 함수를 사용하여 시스템 명령을 비동기적으로 실행하고 결과를 반환할 수 있습니다. 코드는 다음과 같습니다.
function async_exec($cmd)
{
    $fp = popen($cmd, "r");
    if ($fp) {
        while (!feof($fp)) {
            yield fread($fp, 8192);
        }
        pclose($fp);
    }
}

$s = microtime(true);
$coroutine = async_exec('ls /');
foreach ($coroutine as $stdout) {
    echo $stdout;
}
$e = microtime(true);
echo "Time used: " . ($e - $s) . "s
";

위 코드에서는 async_exec 함수를 사용하여 실행합니다. 시스템 명령을 비동기적으로 수행하고, Yield를 사용하여 단계별로 읽어 출력 결과를 얻고 마지막으로 명령이 실행된 시간을 출력합니다.

연결 풀 기술
  1. Swoole에는 데이터베이스 연결 풀 기능이 내장되어 있어 swoole_mysql 코루틴 클라이언트를 통해 데이터베이스 운영을 단순화하고 동시 실행 효율성을 높일 수 있습니다. 코드는 다음과 같습니다.
$pool = new SwooleCoroutineChannel(10);
for ($i = 0; $i < 10; $i++) {
    $conn = new SwooleCoroutineMySQL();
    $conn->connect([
        'host' => '127.0.0.1',
        'user' => 'root',
        'password' => '123456',
        'database' => 'test',
    ]);
    $pool->push($conn);
}

go(function () use ($pool) {
    $conn = $pool->pop();
    $result = $conn->query('select * from users');
    //...
    $pool->push($conn);
});

위 코드에서 먼저 연결 풀을 생성하고 for 루프를 사용하여 10개의 MySQL 연결을 생성하고 연결 풀에 조인한 다음 go 함수를 사용하여 코루틴을 생성하고 연결을 꺼냅니다. 연결 풀에서 데이터베이스 쿼리 작업을 수행하고 마지막으로 연결을 다시 연결 풀에 넣습니다. 커넥션 풀의 장점은 커넥션 생성 및 파괴로 인한 오버헤드를 줄이고 데이터베이스 운영 성능을 향상시킬 수 있다는 점이다.

4. Swoole을 사용하여 마이크로서비스 애플리케이션의 성능을 향상시킨 예

Swoole은 매우 강력한 코루틴 프로그래밍 기능을 갖추고 있으며 개발자가 고성능 및 동시성 서버 측 애플리케이션을 효율적으로 작성하는 데 도움을 줄 수 있습니다. 다음은 마이크로서비스 애플리케이션을 예로 들어 Swoole의 코루틴 기술을 사용하여 애플리케이션 성능을 향상시키는 방법을 보여줍니다.

마이크로서비스 시뮬레이션 프로그램
  1. 먼저 다음 코드를 사용하여 간단한 마이크로서비스 프로그램을 만듭니다.
<?php
//微服务1
function service1($str)
{
    $result = file_get_contents("http://127.0.0.1:8888/service2?str=".$str);
    return strtoupper($result);
}

//微服务2
function service2($str)
{
    return md5($str);
}

//路由处理
$uri = $_SERVER['REQUEST_URI'];
if (preg_match("/^/service1?str=(.*)$/", $uri, $match)) {
    echo service1($match[1]);
} elseif (preg_match("/^/service2?str=(.*)$/", $uri, $match)) {
    echo service2($match[1]);
} else {
    echo "Unknown Request: ".$uri;
}

위 프로그램은 service1과 service2라는 두 가지 서비스를 제공하는 간단한 마이크로서비스 시뮬레이션 프로그램입니다. 서비스 1은 서비스 2를 호출하고 반환 결과를 대문자 형식으로 변환합니다. 서비스 2는 입력 문자열을 MD5로 암호화하여 반환합니다.

Swoole을 사용하여 코루틴 버전의 마이크로서비스 구현
  1. Swoole을 사용하여 코루틴 버전의 마이크로서비스를 구현합니다. 코드는 다음과 같습니다.
<?php
$http = new SwooleHttpServer("0.0.0.0", 8888);

$http->on("request", function ($request, $response) {
    $uri = $request->server['request_uri'];
    if (preg_match("/^/service1?str=(.*)$/", $uri, $match)) {
        $result = go(function () use ($match) {
            $str = $match[1];
            $result = await service2($str);
            return strtoupper($result);
        });
        $response->end($result);
    } elseif (preg_match("/^/service2?str=(.*)$/", $uri, $match)) {
        $result = go(function () use ($match) {
            $str = $match[1];
            $result = await service2($str);
            return $result;
        });
        $response->end($result);
    } else {
        $response->end("Unknown Request: ".$uri);
    }
});

$http->start();

async function service1($str)
{
    $result = await service2($str);
    return strtoupper($result);
}

async function service2($str)
{
    //模拟异步IO操作
    usleep(1000000);
    return md5($str);
}

위 코드에서 Swoole의 HTTP 코루틴 서버는 마이크로서비스를 제공하고 응답하는 데 사용됩니다. 요청된 URI로 구문 분석하고 해당 서비스를 호출합니다. 서비스 1 처리에서는 서비스 2 서비스를 호출하여 결과를 반환하는데, 호출 메서드는 go 함수를 통해 비동기식이며, 비동기 호출 결과를 기다리기 위해 wait 키워드를 사용한다. 각 마이크로서비스 구현에서 비동기 IO 작업은 Swoole 코루틴의 특성을 더 잘 반영하기 위해 실제 네트워크 IO를 시뮬레이션하는 데 사용됩니다.

요약

Swoole은 개발자가 효율적인 고성능 네트워크 통신 프로그램을 작성하는 데 도움이 될 수 있는 매우 강력한 코루틴 프로그래밍 기능을 제공합니다. 애플리케이션 구현에서 개발자는 코루틴 기술을 사용하여 비동기 프로그래밍을 단순화하고 동시 실행 효율성을 향상시킬 수 있습니다. 위의 예에서는 Swoole을 사용하여 마이크로서비스의 코루틴 버전을 구현했으며, 이를 통해 애플리케이션의 성능과 유지 관리성이 크게 향상되었습니다. 실제 구현에서는 애플리케이션의 성능을 더욱 최적화하기 위해 애플리케이션의 특성에 따라 적절한 비동기 IO 작업, 연결 풀 및 기타 기술을 선택하는 것도 필요합니다.

위 내용은 Swoole의 실제 작동: 코루틴을 사용하여 애플리케이션 성능을 향상시키는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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