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. 코루틴의 공통 기술
동시 작업 처리$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 작업 처리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를 사용하여 단계별로 읽어 출력 결과를 얻고 마지막으로 명령이 실행된 시간을 출력합니다.
연결 풀 기술$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의 코루틴 기술을 사용하여 애플리케이션 성능을 향상시키는 방법을 보여줍니다.
마이크로서비스 시뮬레이션 프로그램<?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을 사용하여 코루틴 버전의 마이크로서비스 구현<?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 중국어 웹사이트의 기타 관련 기사를 참조하세요!