Fiber (PHP 8.1)
Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 91개 중 60번째.
Fibers는 중단 가능한 코드 실행을 지원하는 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();
출력:
Step 1
Between steps
Step 2fiber는 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 요청이나 데이터베이스 쿼리와 같은 동시 작업을 처리하는 비동기 라이브러리를 사용할 때 Fiber를 이해하면 도움이 됩니다.
챌린지
쉬움Fiber와 메인 코드 사이에서 데이터를 전달하면서 Fiber가 실행을 일시 중지하고 재개하는 방식을 보여 주는 작업 스케줄러를 만들어 보겠습니다. 작업을 중단할 수 있는 시스템을 만들고, 그 사이에 다른 작업을 수행할 수 있도록 하겠습니다.
코드를 두 개의 파일로 구성합니다.
TaskRunner.php: 작업을 실행하기 위한 Fiber 기능을 감싸는TaskRunner클래스를 만듭니다. 클래스는 다음을 수행해야 합니다.Fiber인스턴스를 저장할 private 속성을 가집니다.- 생성자 프로모션을 사용하여 생성자에서 작업 이름(string)을 받습니다.
- 주어진 callable로 새 Fiber를 생성하고 저장하는
createTask(callable $task)메서드를 가집니다. - Fiber를 시작하고 Fiber가 일시 중지될 때 전달한 값(또는 최종 반환 값)을 반환하는
start()메서드를 가집니다. - 주어진 값으로 Fiber를 재개하고 다음 일시 중지 값(또는 최종 반환 값)을 반환하는
continue(mixed $value)메서드를 가집니다. - Fiber가 종료되었는지를 반환하는
isFinished(): bool메서드를 가집니다.
main.php: TaskRunner 파일을 포함합니다. 두 개의 입력, 즉 작업 이름과 Fiber에 보낼 메시지를 받습니다.주어진 작업 이름으로
TaskRunner를 만들고, 그런 다음createTask()를 사용하여 다음 작업을 정의합니다.- 먼저
"Waiting for input"문자열과 함께 일시 중지합니다. - 재개될 때 값을 받습니다.
"Completed: [received value]"를 반환합니다.
작업을 시작하고 처음 일시 중지될 때 반환되는 값을 출력합니다. 그런 다음 Fiber의 일시 중지 사이에 작업이 수행되고 있음을 보여 주기 위해
"Processing..."을 출력합니다. 마지막으로 메시지 입력을 전달하여 Fiber를 재개하고 최종 결과를 출력합니다.- 먼저
이 챌린지는 Fiber가 협력적 멀티태스킹을 가능하게 하는 방식을 보여 줍니다. 작업은 적절한 지점에서 스스로 일시 중지하고, 메인 코드는 다른 작업을 수행한 다음 새로운 데이터와 함께 작업을 재개합니다. Fiber는 전체 과정에서 자신의 상태를 유지하므로, 정확히 중단했던 지점부터 계속 실행됩니다.
직접 해보기
<?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: 최종 결과 출력
?>이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 PHP 컴파일러