>  기사  >  PHP 프레임워크  >  Swoole의 실제 작동: 캐싱 작업에 코루틴을 사용하는 방법

Swoole의 실제 작동: 캐싱 작업에 코루틴을 사용하는 방법

PHPz
PHPz원래의
2023-11-07 15:00:171337검색

Swoole의 실제 작동: 캐싱 작업에 코루틴을 사용하는 방법

Swoole은 최근 고성능 비동기식 네트워크 프레임워크로 개발자들의 사랑을 받으며 다양한 분야에서 널리 사용되고 있습니다. Swoole을 사용하는 과정에서 코루틴은 비동기 코드를 동기 방식으로 작성할 수 있게 해주는 매우 중요한 개념 중 하나입니다. 이 기사에서는 Swoole에서 캐싱 작업을 위해 코루틴을 사용하는 방법을 소개하고 실용적인 코드 예제를 제공합니다.

1. 코루틴이란 무엇입니까? 코루틴은 사용자 모드의 경량 스레드로, 시스템 스레드의 소비 및 전환을 방지하여 코드를 통해 관리됩니다. Swoole에서는 코루틴을 사용하여 데이터베이스 연결, Redis 작업 등과 같은 I/O 집약적인 네트워크 작업 문제를 해결할 수 있습니다. 코루틴은 I/O 작업이 발생하면 사전에 제어를 포기하고 실행을 다시 시작하기 전에 작업이 완료될 때까지 기다릴 수 있습니다.

2. Swoole의 코루틴 지원

Swoole은 버전 1.8.0부터 코루틴 지원을 도입했습니다. 이 지원은 코루틴, go, defer, 채널 등을 포함한 코루틴 스케줄링을 구현하는 일련의 API를 제공합니다.

1. 코루틴

코루틴은 함수를 코루틴으로 변환할 수 있게 해줍니다. 예:

function test()
{
    echo "start
";
    Coroutine::sleep(1);
    echo "end
";
}

Coroutine::create('test');
echo "hello
";

이 예에서는 테스트 함수를 코루틴으로 변환하고 Coroutine::create를 사용합니다. () 코루틴을 생성합니다. 코루틴에서는 Coroutine::sleep()을 사용하여 I/O 작업을 시뮬레이션합니다. 이 작업을 수행하면 코루틴이 1초 동안 일시 중지된 다음 다시 시작되고 계속해서 "end"가 출력됩니다. 마지막으로 코루틴의 비동기 특성을 보여주는 "hello"가 출력됩니다.

2. go

go는 함수를 코루틴으로 실행할 수 있게 해주는 특수 함수입니다. 예:

go(function(){
    echo "hello
";
    Coroutine::sleep(1);
    echo "world
";
});
echo "start
";

이 예제에서는 go()를 사용하여 익명 함수를 실행합니다. 함수에서는 "hello"를 출력하고 1초 동안 멈춘 후 "world"를 차례로 출력합니다. 마지막으로 "start"가 출력되는데, 이는 코루틴을 사용하여 이 함수를 동시에 실행한다는 것을 증명합니다.

3. defer

defer를 사용하면 코루틴 종료 시 데이터베이스 연결 닫기, 리소스 해제 등과 같은 일부 정리 작업을 수행할 수 있습니다. 사용법은 다음과 같습니다.

go(function(){
    $db = new Redis();
    $db->connect('127.0.0.1', 6379);
    defer(function() use ($db) {
        $db->close();
    });

    $db->set('key', 'value');
    Coroutine::sleep(1);
    $value = $db->get('key');
    echo $value."
";
});

이 예에서는 defer를 사용합니다. 코루틴의 끝 Redis 연결이 닫힙니다. defer를 사용하지 않으면 코루틴이 종료될 때 연결을 닫는 것을 잊어버려 연결 수가 누출될 수 있습니다.

4. Channel

channel은 Swoole에서 제공하는 파이프와 같은 메커니즘으로, 다음과 같이 여러 코루틴 간의 통신을 허용합니다.

$chan = new CoroutineChannel(1);

go(function() use($chan) {
    $data = Coroutine::getuid();
    $chan->push($data);
});

$data = $chan->pop();
echo $data."
";

이 예에서는 용량이 1인 채널을 만든 다음 데이터를 코루틴의 채널에 보내고 다른 코루틴의 채널에 있는 데이터를 팝하여 출력합니다. 채널을 사용하면 코루틴 간에 데이터를 전송하고 공동 작업 처리를 완료할 수 있습니다.

3. 코루틴 연산 캐시

실제 개발에서 캐시는 데이터베이스 부담을 줄이고 캐시 적중을 통해 데이터 읽기 속도를 높일 수 있는 매우 중요한 구성 요소입니다. Swoole에서는 Redis와 같은 인메모리 데이터베이스를 사용하여 캐싱을 구현하는 동시에 코루틴을 사용하여 캐시의 동시성 성능을 향상시킬 수 있습니다.

1. Redis에 연결

Swoole의 코루틴 Redis 클라이언트를 사용하여 Redis 데이터베이스에 연결하고 동시에 작동합니다.

$redis = new SwooleCoroutineRedis();
$redis->connect('127.0.0.1', 6379);

go(function () use ($redis) {
    $redis->set('name', 'Bob');
    $name = $redis->get('name');
    echo "name=$name
";
});

go(function () use ($redis) {
    $redis->set('age', 18);
    $age = $redis->get('age');
    echo "age=$age
";
});

SwooleCoroutine::sleep(1);

이 예에서는 Swoole의 코루틴 Redis 클라이언트를 사용하여 Redis 데이터베이스에 연결합니다. 그런 다음 코루틴 형태로 읽기 및 쓰기 작업을 수행하고 코루틴 내에서 관련 결과를 출력했습니다. 마지막으로 SwooleCoroutine::sleep()을 사용하여 코루틴이 완료될 때까지 일정 시간 동안 기다립니다. 유사한 방식으로 다른 인메모리 데이터베이스에 연결하고 작동할 수 있습니다.

2. 캐시 작업

Redis에 연결한 후 일련의 캐시 명령을 사용하여 작업할 수 있습니다. 예를 들어 캐시된 데이터를 설정하려면 set() 메서드를 사용할 수 있습니다.

$redis->set('key', 'value');

여기서 'key'는 캐시된 데이터의 키이고 'value'는 캐시된 데이터의 값입니다. 캐시된 데이터를 읽으려면 get() 메서드를 사용할 수 있습니다.

$value = $redis->get('key');

코루틴에서는 위 명령을 사용하여 동시에 작동할 수 있습니다. 예:

go(function() use($redis){
    $redis->set('key1', 'value1');
    $value1 = $redis->get('key1');
    echo "key1=$value1
";
});

go(function() use($redis){
    $redis->set('key2', 'value2');
    $value2 = $redis->get('key2');
    echo "key2=$value2
";
});

SwooleCoroutine::sleep(1);

이 예에서는 두 개의 코루틴에 각각 두 개의 캐시된 데이터를 설정하고 읽은 다음 동시에 작동했습니다. 이는 코루틴이 캐시된 데이터의 동시성 성능을 향상시킬 수 있음을 입증합니다.

3. 캐시 및 MySQL 작업

실제 응용 프로그램에서는 일반적으로 캐시에서 데이터를 먼저 읽고, 캐시가 없으면 MySQL에서 읽는 등의 작업을 위해 캐시와 MySQL을 결합해야 합니다. Swoole의 코루틴 개발에서는 다음과 유사한 방법을 사용하여 이 작업을 구현할 수 있습니다.

$redis = new SwooleCoroutineRedis();
$redis->connect('127.0.0.1', 6379);

$mysql = new SwooleCoroutineMySQL();
$mysql->connect([
    'host' => '127.0.0.1',
    'port' => 3306,
    'user' => 'root',
    'password' => '123456',
    'database' => 'test',
]);

go(function() use($redis, $mysql) {
    $name = $redis->get('name');
    if($name === false) {
        $result = $mysql->query('select * from user where id=1');
        if(!empty($result)) {
            $name = $result[0]['name'];
            $redis->set('name', $name);
        }
    }
    echo "name=$name
";
});

go(function() use($redis, $mysql) {
    $age = $redis->get('age');
    if($age === false) {
        $result = $mysql->query('select * from user where id=1');
        if(!empty($result)) {
            $age = $result[0]['age'];
            $redis->set('age', $age);
        }
    }
    echo "age=$age
";
});

SwooleCoroutine::sleep(1);

이 예에서는 코루틴 작업 방법을 사용합니다. 캐시에 없는 경우 먼저 캐시에서 데이터를 읽으려고 시도합니다. , MySQL에서 데이터를 읽습니다. MySQL을 운영할 때 스레드 차단을 방지하고 효율성을 높이기 위해 코루틴도 사용합니다. 마지막으로 이 작업 방법의 정확성을 증명하기 위해 읽기 결과를 인쇄했습니다.

위는 Swoole에서 캐시 작업을 위해 코루틴을 사용하는 구체적인 구현 방법입니다. 코루틴은 캐시 작업의 효율성과 동시성 성능을 향상시킬 수 있으며 MySQL과 같은 다른 작업과 결합될 수 있습니다. 실제 개발에서는 위의 방법으로 연습하고 실제 상황에 따라 조정과 변경을 할 수 있습니다.

위 내용은 Swoole의 실제 작동: 캐싱 작업에 코루틴을 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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