Fibers (PHP 8.1)
Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 91개 중 60번째.
Fibers는 중단 가능한 코드 실행을 가능하게 하는 PHP 8.1 기능입니다. 처음부터 끝까지 실행되는 일반 함수와 달리, fiber는 실행 중간에 스스로 일시 정지하고 나중에 resume할 수 있으며, 일시 정지 between 상태를 유지합니다.
Fiber 클래스에 callable을 전달하여 fiber를 생성한 다음, start()로 실행을 시작합니다:
<?php
$fiber = new Fiber(function(): void {
echo "Step 1\n";
Fiber::suspend();
echo "Step 2\n";
});
$fiber->start();
echo "Between steps\n";
$fiber->resume();
출력:
Step 1
Between steps
Step 2파이버는 Fiber::suspend()에 도달할 때까지 실행되며, 그 후 제어권이 메인 코드로 반환됩니다. resume()을(를) 호출하면 일시 중지된 지점부터 실행이 재개됩니다.
Fiber는 일시 중단 및 재개할 때 값을 전달할 수도 있습니다:
<?php
$fiber = new Fiber(function(): string {
$value = Fiber::suspend("paused");
return "Received: $value";
});
$suspended = $fiber->start();
echo "$suspended\n";
$result = $fiber->resume("hello");
echo $result;
출력:
paused
Received: helloFiber는 비동기 PHP 프레임워크의 기반입니다. 대부분의 애플리케이션에서 직접 사용할 일은 많지 않지만, Fiber를 이해하면 HTTP 요청이나 데이터베이스 쿼리와 같은 동시 작업을 블로킹 없이 처리하는 비동기 라이브러리를 다룰 때 큰 도움이 됩니다.
챌린지
쉬움파이버가 실행을 중지하고 재개하면서 파이버와 메인 코드 사이에 데이터를 전달하는 방법을 보여주는 작업 스케줄러를 구축해 보겠습니다. 작업이 중간에 중단되어 그 사이에 다른 작업이 수행될 수 있는 시스템을 만들 것입니다.
두 개의 파일에 코드를 작성합니다:
TaskRunner.php— 작업을 실행하기 위해 파이버 기능을 래핑하는TaskRunner클래스를 만듭니다. 이 클래스는 다음 항목을 포함해야 합니다:Fiber인스턴스를 저장하는 private 프로퍼티- 생성자 프로모션(constructor promotion)을 사용하여 생성자에서 작업 이름(string)을 전달받음
- 전달된
callable로 새 Fiber를 생성하고 저장하는createTask(callable $task)메서드 - 파이버를 시작하고 파이버가 중단될 때 반환하는 값(또는 최종 반환값)을 반환하는
start()메서드 - 전달된 값으로 파이버를 재개하고 다음 중단된 값(또는 최종 반환값)을 반환하는
continue(mixed $value)메서드 - 파이버가 종료되었는지 여부를 반환하는
isFinished(): bool메서드
main.php— TaskRunner 파일을 포함합니다. 작업 이름과 파이버로 보낼 메시지라는 두 개의 입력을 받게 됩니다.전달된 작업 이름으로
TaskRunner를 생성한 다음,createTask()를 사용하여 다음을 수행하는 작업을 정의합니다:- 먼저 문자열
"Waiting for input"으로 일시 중지됩니다. - 재개될 때 값을 받습니다.
"Completed: [received value]"를 반환합니다.
작업을 시작하고 처음 일시 중지될 때 반환되는 값을 출력합니다. 그런 다음 파이버 일시 중지 사이에 진행되는 작업을 보여주기 위해
"Processing..."을 출력합니다. 마지막으로 메시지 입력을 전달하여 파이버를 재개하고 최종 결과를 출력합니다.- 먼저 문자열
이 챌린지는 파이버가 협동 멀티태스킹(cooperative multitasking)을 구현하는 방법을 보여줍니다. 작업은 적절한 시점에 스스로 일시 중지되고, 메인 코드가 다른 작업을 수행한 후 새 데이터로 작업을 재개합니다. 파이버는 전체 과정에서 상태를 유지하며 정확히 중단된 지점에서 다시 시작됩니다.
직접 해보기
<?php
require_once 'TaskRunner.php';
// 입력 읽기
$taskName = trim(fgets(STDIN));
$message = trim(fgets(STDIN));
// TODO: 주어진 작업 이름으로 TaskRunner 생성
// TODO: createTask()를 사용하여 다음을 수행하는 작업 정의:
// 1. First suspends with the string "Waiting for input"
// 2. 재개될 때 값을 받음
// 3. "Completed: [received value]"를 반환
// TODO: 작업을 시작하고 처음 일시 중지될 때 반환하는 내용을 출력
// TODO: 파이버 일시 중지 사이에 작업이 진행 중임을 보여주기 위해 "Processing..." 출력
// TODO: 메시지 입력을 전달하여 파이버 계속
// TODO: 최종 결과 출력
?>이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8매직 메서드
매직 메서드 소개__toString 및 __debugInfo__get, __set, __isset, __unset__call 및 __callStatic__clone 및 객체 복제__serialize 및 __unserialize요약 - 커스텀 컬렉션