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