Menu
Coddy logo textTech

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: hello

Fiber는 비동기 PHP 프레임워크의 기반입니다. 대부분의 애플리케이션에서 직접 사용할 일은 많지 않지만, Fiber를 이해하면 HTTP 요청이나 데이터베이스 쿼리와 같은 동시 작업을 블로킹 없이 처리하는 비동기 라이브러리를 다룰 때 큰 도움이 됩니다.

challenge icon

챌린지

쉬움

파이버가 실행을 중지하고 재개하면서 파이버와 메인 코드 사이에 데이터를 전달하는 방법을 보여주는 작업 스케줄러를 구축해 보겠습니다. 작업이 중간에 중단되어 그 사이에 다른 작업이 수행될 수 있는 시스템을 만들 것입니다.

두 개의 파일에 코드를 작성합니다:

  • TaskRunner.php — 작업을 실행하기 위해 파이버 기능을 래핑하는 TaskRunner 클래스를 만듭니다. 이 클래스는 다음 항목을 포함해야 합니다:
    • Fiber 인스턴스를 저장하는 private 프로퍼티
    • 생성자 프로모션(constructor promotion)을 사용하여 생성자에서 작업 이름(string)을 전달받음
    • 전달된 callable로 새 Fiber를 생성하고 저장하는 createTask(callable $task) 메서드
    • 파이버를 시작하고 파이버가 중단될 때 반환하는 값(또는 최종 반환값)을 반환하는 start() 메서드
    • 전달된 값으로 파이버를 재개하고 다음 중단된 값(또는 최종 반환값)을 반환하는 continue(mixed $value) 메서드
    • 파이버가 종료되었는지 여부를 반환하는 isFinished(): bool 메서드
  • main.php — TaskRunner 파일을 포함합니다. 작업 이름과 파이버로 보낼 메시지라는 두 개의 입력을 받게 됩니다.

    전달된 작업 이름으로 TaskRunner를 생성한 다음, createTask()를 사용하여 다음을 수행하는 작업을 정의합니다:

    1. 먼저 문자열 "Waiting for input"으로 일시 중지됩니다.
    2. 재개될 때 값을 받습니다.
    3. "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: 최종 결과 출력

?>
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨