我在 Windows 10 上运行 PHP CLI。我已通过 winget 安装了 Windows Terminal。出于多种原因,我长的尝试将我的 PHP CLI 脚本从使用 cmd.exe 切换到使用 PowerShell 或 Windows Terminal。
但是,经过一整天的实验后,我确定了以下几点:
使用 cmd.exe 启动 100 个 PHP CLI 脚本几乎不会对 CPU 和 RAM 使用率产生明显影响。我一直这样做。(自动在后台启动,所有启动最小化并分组到同一个任务栏图标,同时执行各种任务。)
使用 PowerShell 或 Windows 终端启动 100 个 PHP CLI 脚本 (是的,甚至使用新标签而不是新的单独实例!) 导致我强大的计算机无法使用。所有 CPU 和大量 RAM 都被占用,各种错误消息开始弹出,任务栏图标无法点击以显示窗口;一切都“出问题了”。
如果我直接执行诸如“php test.php”之类的命令,而不连接任何终端,它会打开某种 PHP 品牌的窗口,但似乎在“后台”使用了 cmd.exe,所以这与明确使用 cmd.exe 相同。
我的结论是,除了 cmd.exe 之外,几乎不可能使用任何其他工具来执行 PHP CLI。我搜索、询问并进行了大量与此相关的实验。
我首先需要从 cmd.exe 切换的主要原因是每当调用 PowerShell 命令时,窗口都会改变样式从以 cmd.exe 形式启动的 PHP CLI 脚本,如果我使用 PowerShell 或 Windows 终端,则不会发生这种情况。
但是由于 PowerShell 和 Windows Terminal 都非常耗费资源,所以我无法使用它们。
是否有某种秘密方法可以启动它们的“最小”版本?我似乎甚至无法购买一台功能足够强大的机器来支持我(相对)少数 CLI 实例。
我没有想到这会是一个问题,而且我不明白无论这些终端多么“先进”,怎么会出现这种情况。
答案1
如果我直接执行诸如“php test.php”之类的命令,而不连接任何终端,它会打开某种 PHP 品牌的窗口,但似乎在“后台”使用了 cmd.exe,所以这与明确使用 cmd.exe 相同。
但事实并非如此。相反,两个都php.exe 和 cmd.exe(以及 PowerShell.exe)使用相同类型的自动控制台窗口,该窗口在 Vista 中被称为“Conhost”,以前是 XP 中 CSRSS 的一部分。
Conhost 是内置的终端/控制台,它会为所有在其 .exe 文件中设置了“控制台”标志的应用程序自动打开(尽管直到 Windows 8.1 它才具备任何 Unix 风格的终端控制功能,因此称为“控制台”而不是“终端”)。
(实际上,Conhost 还会“记住”每个可执行文件和/或每个快捷方式的控制台窗口外观,例如,导致 PowerShell.exe 控制台默认具有蓝色背景 - 尽管我怀疑 PowerShell 也可能故意调整其控制台字体在启动时也是如此。)
Cmd.exe 和 PowerShell 本身没有视觉外观(不包括旧的 PowerShell ISE)——它们总是在 Conhost 或 Windows Terminal 中运行,如果需要,操作系统会自动打开 Conhost。(从 Windows 11 开始,操作系统可以自动打开 Windows Terminal。)
使用 PowerShell 或 Windows 终端启动 100 个 PHP CLI 脚本(是的,甚至使用新选项卡而不是新的单独实例!)会导致我强大的计算机无法使用。所有 CPU 和大量 RAM 都被占用,各种错误消息开始弹出,任务栏图标变得无法点击以显示窗口;一切都“出问题了”。
Windows Terminal 使用 GPU 渲染(Windows 10 开始菜单 UI 也是如此),所以我猜这可能表明其架构效率低下,导致它们争夺资源。尝试通过其配置文件设置启用替代的“Atlas”渲染引擎。
是否有某种秘密方法可以启动它们的“最小”版本?我似乎甚至无法购买一台功能足够强大的机器来支持我(相对)少数 CLI 实例。
您已经这样做了。运行 php.exe 或 cmd.exe 时获得的 Conhost 控制台窗口非常小。
答案2
无论如何,我认为您对终端和 shell 的概念有些困惑。Windows Terminal 是一个终端仿真器,可以运行任何 shell,如 CMD 或 PowerShell。“Conhost”(老式控制台窗口)同样是一个“终端”。@user1686 在上面也说过同样的话。
Windows 终端将 PowerShell 设置为默认 shell,但您随时可以cmd.exe
在设置中将其更改。
你能上传一个最小的复现版本吗https://github.com/microsoft/terminal? 终端应该是小的当然,它比 conhost 更耗费资源。但我不认为你所描述的情况会像你提到的那样糟糕,因为 Windows Terminal 被设置为默认终端。这听起来就像运行的任何脚本都是故意地打开一堆控制台窗口,而不是重用启动它的那个窗口。或者更微妙的是 - 它没有传递正确的标志来CreateProcess
隐藏控制台窗口(这将使终端无法使用)。