Re: [RFC] Io\Terminal

From: Date: Mon, 05 Oct 2026 12:47:10 +0000
Subject: Re: [RFC] Io\Terminal
References: 1 2 3 4 5 6 7 8 9 10 11  Groups: php.internals 
Request: Send a blank email to internals+get-132786@lists.php.net to get a copy of this message
Hi On 2026-10-02 22:38, Pratik Bhujel wrote:
I also checked Windows because I did not want to assume the POSIX PTY mechanism translated there. It does not directly, since proc_open() on Windows does not provide the same PTY descriptor. I built the current branch on Windows 11 ARM64 and exercised the native console path instead. The PHP side was just:
    $t = Io\Terminal\SystemTerminal::fromStdio();
    var_dump($t->readKey());
A small harness attached to a real Windows console injected KEY_EVENT records into CONIN$ with WriteConsoleInputW(). Injecting Up produced:
    enum(Io\Terminal\Key::Up)
[…] straightforward cross-platform testing seam is still relevant for Windows code that directly consumes readKey().
I know nothing about Windows, but am seeing that proc_open() offers a create_new_console option that is documented as:
create_new_console (windows only): the new process has a new console, instead of inheriting its parent's console
Is that perhaps already all that is required? Or would a (Windows-specific) helper Io\Terminal\inject_fake_keypress() outside of the main terminal API be helpful?
On the interface question, Tim's objections to the current Terminal/ModeToken shape still make sense to me, especially the ModeToken case where a userland token can satisfy the interface but cannot actually be restored by the native terminal. At the same time, after checking Windows I don't think I can honestly say that php://memory or stream injection alone makes the interface unnecessary everywhere. It clearly solves readLine(), and the PTY gives us a good POSIX integration seam, but Windows userland code directly consuming readKey() does not have the same pure-PHP PTY seam today.
It sounds to me that “PHP is unable to spawn terminals on Windows” is an orthogonal concern and a pre-existing limitation of e.g. the proc_open() API. The lack of Windows support must not influence the design of the Io\Terminal API to introduce a “short term” workaround that will become obsolete as soon as PHP will be able to spawn terminals on Windows, but that will affect the Io\Terminal API in a negative way for eternity. We should try very hard that every new API we add to the standard library is well-designed and convenient to use for 15+ years without introducing breaking changes. Perhaps Ilia’s suggestion of just allowing a php://memory stream is okay, keeps readKey() capabilities in sync with readLine() and fills gap until proc_open() is extended for proper end-to-end testing? Best regards Tim Düsterhus

« previous php.internals (#132786) next »