Fibers

Fibers

Fibers 개요

(PHP 8 >= 8.1.0)

Fibers는 전체 콜 스택을 가진, 중단 가능한 함수예요. 콜 스택 어디에서든 Fiber를 중단(suspend)할 수 있고, 중단된 동안 그 fiber 안의 실행이 멈췄다가 나중에 다시 재개(resume)돼요.

Fibers는 실행 스택 전체를 멈추기 때문에, 함수를 호출하는 쪽에서는 호출 방식을 바꿀 필요가 없어요.

실행은 콜 스택 어디에서든 Fiber::suspend()를 호출해 중단할 수 있어요. 즉 Fiber::suspend() 호출이 아주 깊게 중첩된 함수 안에 있을 수도 있고, 아예 존재하지 않을 수도 있어요.

스택이 없는 Generators와 달리, Fibers는 각자 자신만의 콜 스택을 가져요. 그래서 깊게 중첩된 함수 호출 안에서도 중단할 수 있어요. 중단 지점(즉 Fiber::suspend()를 호출하는 것)을 선언한 함수는 반환 타입을 바꿀 필요가 없어요. 반면 yield를 쓰는 함수는 Generator 인스턴스를 반환해야 하죠.

Fibers는 어떤 함수 호출에서든 중단할 수 있어요. PHP VM 안에서 호출되는 함수들도 포함이에요. 예를 들어 array_map()에 넘겨주는 함수라든지, foreachIterator 객체를 돌 때 호출되는 메서드 같은 것들이요.

한번 중단된 fiber는 Fiber::resume()으로 어떤 값이라도 넘겨 재개할 수 있고, Fiber::throw()로 fiber 안에 예외를 던질 수도 있어요. 그 값(또는 예외)은 Fiber::suspend()의 반환값(또는 throw된 예외)으로 돌아와요.

참고: PHP 8.4.0 이전에는 객체의 소멸자(destructor)가 실행되는 동안 fiber를 전환하는 것이 허용되지 않았어요.

예제 #1 기본 사용법

<?php
$fiber = new Fiber(function (): void {
   $value = Fiber::suspend('fiber');
   echo "Value used to resume fiber: ", $value, PHP_EOL;
});

$value = $fiber->start();

echo "Value from fiber suspending: ", $value, PHP_EOL;

$fiber->resume('test');
?>

위 예제는 다음과 같이 출력돼요:

Value from fiber suspending: fiber
Value used to resume fiber: test