Bug #81254 [Opn->Csd]: PHP8.1: undefined method Fiber::this()

From: Date: Mon, 12 Jul 2021 21:07:32 +0000
Subject: Bug #81254 [Opn->Csd]: PHP8.1: undefined method Fiber::this()
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-234993@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=81254&edit=1 ID: 81254 User updated by: rainer dot jung at kippdata dot de Reported by: rainer dot jung at kippdata dot de Summary: PHP8.1: undefined method Fiber::this() -Status: Open +Status: Closed Type: Bug Package: Unknown/Other Function Operating System: Linux, Solaris Sparc PHP Version: 8.1.0alpha3 Block user comment: N Private report: N New Comment: Sorry, my bad: I now saw on php internals, that Fiber::this() got renamed to Fiber::getCurrent(). The corrected script works. Previous Comments: ------------------------------------------------------------------------ [2021-07-12 21:04:48] rainer dot jung at kippdata dot de Description: ------------ I tried the second example from https://wiki.php.net/rfc/fibers The script fails, details see below. Test script: --------------- <?php class EventLoop { private string $nextId = 'a'; private array $deferCallbacks = []; private array $read = []; private array $streamCallbacks = []; public function run(): void { while (!empty($this->deferCallbacks) || !empty($this->read)) { $defers = $this->deferCallbacks; $this->deferCallbacks = []; foreach ($defers as $id => $defer) { $defer(); } $this->select($this->read); } } private function select(array $read): void { $timeout = empty($this->deferCallbacks) ? null : 0; if (!stream_select($read, $write, $except, $timeout, $timeout)) { return; } foreach ($read as $id => $resource) { $callback = $this->streamCallbacks[$id]; unset($this->read[$id], $this->streamCallbacks[$id]); $callback($resource); } } public function defer(callable $callback): void { $id = $this->nextId++; $this->deferCallbacks[$id] = $callback; } public function read($resource, callable $callback): void { $id = $this->nextId++; $this->read[$id] = $resource; $this->streamCallbacks[$id] = $callback; } } [$read, $write] = stream_socket_pair( stripos(PHP_OS, 'win') === 0 ? STREAM_PF_INET : STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP ); // Set streams to non-blocking mode. stream_set_blocking($read, false); stream_set_blocking($write, false); $loop = new EventLoop; // Read data in a separate fiber after checking if the stream is readable. $fiber = new Fiber(function () use ($loop, $read): void { echo "Waiting for data...\n"; $fiber = Fiber::this(); $loop->read($read, fn() => $fiber->resume()); Fiber::suspend(); $data = fread($read, 8192); echo "Received data: ", $data, "\n"; }); // Start the fiber, which will suspend while waiting for a read event. $fiber->start(); // Defer writing data to an event loop callback. $loop->defer(fn() => fwrite($write, "Hello, world!")); // Run the event loop. $loop->run(); ?> Expected result: ---------------- From the RFS: Waiting for data... Received data: Hello, world! Actual result: -------------- /path/to/bin/php fiber.php Waiting for data... Fatal error: Uncaught Error: Call to undefined method Fiber::this() in /var/tmp/fiber.php:66 Stack trace: #0 [internal function]: {closure}() #1 /var/tmp/fiber.php(76): Fiber->start() #2 {main} thrown in /var/tmp/fiber.php on line 66 ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=81254&edit=1

« previous php.bugs (#234993) next »