Fibers e Concorrência no PHP

Quem sou eu?

Foto do Ronny John

Ronny John

  • Técnico em Informática
  • Aprendendo PHP desde 2018
  • Desenvolvedor
    • PHP
    • Javascript, Go e Kotlin
  • Frustrado pelo WhatsApp Web
    Não funciona Não serve pra nada
  • Rato de comunidade
  • Frequentador assíduo do PHPinga
Fibers

Como é a execução do PHP

PHP é tradicionalmente single-threaded com execução sequencial

Imagem retirada do vídeo do canal DifferDev

Fibers

  • Podem executar nosso código
  • Podem suspender a própria execução
  • Podem ser retomadas depois em outro lugar
  • Podem cuspir algum valor na suspensão
  • Não adiciona multithreading ao PHP
"Fibers são corrotinas de baixo nível para manipulação de concorrência no PHP."

Classe

                
                    final class Fiber {
                        public function __construct(callable $callback) {}
                        public function start(mixed ...$args): mixed {}
                        public function resume(mixed $value = null): mixed {}
                        public function throw(Throwable $exception): mixed {}
                        public function getReturn(): mixed {}
                        public function isStarted(): bool {}
                        public function isSuspended(): bool {}
                        public function isRunning(): bool {}
                        public function isTerminated(): bool {}
                        public static function suspend(mixed $value = null): mixed {}
                        public static function getCurrent(): ?Fiber {}
                    }
                
            

Exemplo de Fiber

          
            function inspire(string $name) {
              echo "O nome é $name\n";
              $resumeValue = Fiber::suspend($name[0]);
              echo "$name $resumeValue\n";

              return $name;
            }

            $fiber1 = new Fiber(inspire(...));
            $fiber2 = new Fiber(inspire(...));

            $suspend1 = $fiber1->start('Rapadura');
            $suspend2 = $fiber2->start('PHP');

            echo "Fiber1 foi suspensa com $suspend1\n";
            echo "Fiber2 foi suspensa com $suspend2\n";

            $fiber2->resume('is not dead');
            $fiber1->resume('is sweet, but is not soft');

            echo "Fiber1 retornou {$fiber1->getReturn()}";
            echo "Fiber2 retornou {$fiber2->getReturn()}";
          
        
          
            O nome é Rapadura
            O nome é PHP
            Fiber1 foi suspensa com R
            Fiber2 foi suspensa com P
            PHP is not dead
            Rapadura is sweet, but is not soft
            Fiber1 retornou Rapadura
            Fiber2 retornou PHP
          
        

Prática

Gist

Ferramentas usando Fibers

- AMPHP
- ReactPHP (experimental)
- Swoole* (ao lado das corrotinas Swoole para melhor desempenho)

Referências

PHP Fibers - Milko Kosturkov - PHP UK 2022
PHP: Fibers - Manual do PHP
PHP Fibers - DifferDev
PHP 8.1: Fibers - PHP Watch

Obrigado! 🚀