在Windows平台上使用PHP CLI获取终端布局。
在Windows平台上使用PHP CLI(在PHP 7.4上测试)可以通过$_SERVER
数组访问,但它不包含任何与HTTP服务器相关的变量。剩下的变量会根据您的环境而有所不同。我查看了Windows 10的Command Prompt和CygWin,以及Centos 7。它们都不包括客户端终端大小或其他窗口系统信息。(对于通过HTTP的PHP也是如此,您需要使用Javascript来获取用户代理的大小。)
如果在终端中运行php -i
命令,您将看到完整的可用服务器和环境变量列表。但正如我所指出的,用户代理的大小不是其中之一。(也许有一款用户代理可以输入大小,我不知道!)
我们必须在这里做一些其他的事情,即运行一个shell命令并查询底层平台以获取信息。首先,一个简单的“老派”的解决方案(在CMD和PS中都适用):
// 在Windows上使用PHP作为CLI。 $info = shell_exec('MODE');
在不带参数的情况下运行MODE
命令会得到以下输出:
Status for device CON:
----------------------
Lines: 9001
Columns: 120
Keyboard rate: 31
Keyboard delay: 1
Code page: 65001
“Columns”行显示窗口的字符宽度。(注意:此输出是与语言环境相关的。您可能会得到“Columnas”或“Oszlopok”等不同的结果。)然后让我们解析出数字:
preg_match('~Columns:\s+(\d+)~', $info, $match); $columns = $match[1] ?? null;
如果数据可用,$columns
变量将包含当前命令提示符终端的字符宽度。如果没有数据,则设置默认宽度(这里简单地设置为“null”)。
这个解决方案只适用于在Windows Command Prompt和Power Shell上使用PHP CLI,或者其他(可能是Microsoft)支持MODE
命令的终端应用程序。
如果可以调用PowerShell,还有一种更简洁的方法来获取列宽。列宽/字符宽度存储在PS的$Host
对象中:
// 返回列数: $columns = shell_exec('powershell $Host.UI.RawUI.WindowSize.Width');
对于其他平台,您需要找到一个等效的命令。在bash中,等效命令是tput cols
(它返回列数)。如下所示:
$columns = shell_exec('tput cols');
这个bash命令在MacOS和CygWin上也适用(已经进行了测试)。非常简单!
读者们,请随时添加有关在其他平台上获取此数据的注释。我会整合到答案中。
还有一些旧的问题探讨了在不同平台上使用不同方法和语言访问控制台大小的问题。供参考:
如何确定在PHP中安装的终端:cmder、cmd、PS、Linux终端?以实现正确的参数传递给shell_exec()
并获取列数?
为什么不能像这样执行任何命令:$info = shell_exec('MODE') || shell_exec('tput cols');
?
1. 您将不得不比较不同平台/终端之间的服务器/环境变量来确定这一点。
2. 因为如果shell_exec返回一个字符串,比如"'mode' is not recognized as an internal or external command, operable program or batch file",它不会被评估为false
。手册中写道:"此函数在发生错误或程序没有输出时都可以返回NULL。使用此函数无法检测执行失败。如果需要访问程序的退出代码,应该使用exec()函数。"
我已经解决了这个问题:stackoverflow.com/a/63476834/11091648
在Windows平台上使用PHP CLI获取终端布局的问题是如何获取终端的宽度。通过以上给出的代码可以解决这个问题。
代码的逻辑是先执行命令`MODE 2> null`获取终端信息,如果获取不到,则执行命令`tput cols`获取终端宽度。然后通过正则表达式匹配终端信息中的宽度值,并将其输出。
在Windows 10中,使用Cmder命令行工具运行上述代码,终端宽度为75。而在PowerShell中运行代码,终端宽度为95。在通过PuTTY连接到Ubuntu 20.04服务器时,根据PuTTY设置的宽度值,终端宽度为120。
至于其他平台如何获取终端宽度,读者可以自行添加相关注释并添加到答案中。