상현에 하루하루
개발자의 하루

PHP8.1: Fibers

( 업데이트: )

Fibers는 PHP의 훌륭한 추가 기능입니다. green threads로 가는 low-level 방법입니다. 반면에 프로젝트에서 사용할 가능성은 다소 희박합니다. low-level 구성 요소이며 비동기성을 처리하는 라이브러리에서만 사용됩니다.

그럼에도 불구하고 Fibers에 대해 이야기 할 가치가 있습니다.

Fibers는 동일한 물리적 프로세스 내에서 병렬 처리하는 하는 방법입니다. Fibers를 사용할 때 실제 다중 스레드 또는 병렬 프로세스가 없습니다. 즉, 코드에서 동시에 실행되는 부분이 절대 없을 것이지만 코드의 일부가 대기하는 동안 개발자가 다른 작업을 수행 할 수 있습니다.

예를 들어, 코드의 일부가 파일 읽기를 기다리고 있을 때 이미 다른 파일을 가져오기 시작할 수 있습니다. 루프에서 Fibers를 사용할 수 있다고 상상해 보세요. 이제 훨씬 더 효율적인 방식으로 비동기 I/O를 처리할 수 있는 방법이 생겼습니다. 10개의 HTTP 요청을 보내고 하나씩 전송하고 기다리는 대신 모든 요청이 한 번에 완료될 때까지 기다립니다.

Fibers를 사용하면 우아한 방식으로 정확히 그렇게 할 수 있습니다. Fibers는 명시적이고 사용하기 쉬운 API를 제공하지만 기술적으로 이것은 (제너레이터 및 yield를 사용하여) 이미 그들 없이 수행할 수 있기 때문입니다.

I/O 대기가 뒤에서 처리되는 동안 PHP가 실행을 계속할 수 있도록 하는 저수준 함수는 몇 가지 뿐입니다. pcntl_async_signals와 socket_select가 있고 그게 전부입니다. 따라서 Fibers는 환영할만한 추가 사항이지만 “PHP 8.1은 현재 비동기식입니다”라고 주장은 거짓임을 알아야합니다.

PHP8.1은 이전보다 더 이상 “비동기”가 아닙니다.

비동기 I/O 대기를 허용하는 몇 가지 기능이 있으며 Fibers는 이러한 코드를 처리하는 더 깨끗한 API만 제공합니다.