猿问

在 Windows 平台上使用 PHP CLI 获取终端布局

我正在使用 XAMPP 和 Windows,并从终端(cmder 或 CMD 或 Power Shell)运行一些测试文件。

但我需要知道终端布局设置。行宽; 创建适合端子列布局的框架盒或抽屉盒。

我运行它来获取全局变量但什么也没得到:

echo var_dump($_SERVER);

我如何从服务器端获取这些信息?


慕婉清6462132
浏览 124回答 2
2回答

心有法竹

$info = shell_exec('MODE 2> null') ?? shell_exec('tput cols');if (strlen($info) > 5) {    preg_match('/CON.*:(\n[^|]+?){3}(?<cols>\d+)/', $info, $match);    $info = $match['cols'] ?? 80;}echo 'Terminal Width: '. $info;cmder 中的输出(基于 Windows 大小)(Windows 10):C:\xampp\htdocs\dev\avi3\devλ php test.phpTerminal Width: 75PowerShell 中的输出(基于 Windows 大小)(Windows 10):PS C:\xampp\htdocs\dev\avi3\dev> php test.phpTerminal Width: 95从putty(在Windows 10中)输出连接到(Ubuntu 20.04服务器)(基于putty设置,Windows默认固定为80,我将其更改为120):admin@testserver:/var/www/html/dev/$ php test.phpTerminal Width: 120读者:请随时添加有关在其他平台获取此数据的注释。将融入答案。

侃侃尔雅

有一个$_SERVER可通过 PHP CLI 访问的数组(使用 PHP 7.4 进行测试);尽管它不会包含任何与 HTTP 服务器相关的变量。其余部分将根据您的环境而有很大差异。我查看了 Windows 10 上可用的内容,包括命令提示符和 CygWin,以及 Centos 7。没有一个包含客户端大小或其他窗口系统信息。(对于基于 HTTP 的 PHP 来说也是如此;您需要 Javascript 来获取用户代理大小。)作为参考,如果您在终端中运行php -i,您将在最后看到可用服务器和环境变量的完整列表。但正如我所指出的,用户代理大小不是这些变量之一。(也许有一个用户代理可以输入尺寸;我不知道!)我们必须在这里做点别的事情,即。运行 shell 命令并查询底层平台的信息。首先,一个坚韧的“老派”解决方案(在 CMD 和 PS 中都有效):// Using PHP as CLI on Windows.$info = shell_exec('MODE');运行MODE不带参数的命令会得到类似以下输出:Status for device CON:----------------------&nbsp; &nbsp; Lines:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 9001&nbsp; &nbsp; Columns:&nbsp; &nbsp; &nbsp; &nbsp; 120&nbsp; &nbsp; Keyboard rate:&nbsp; 31&nbsp; &nbsp; Keyboard delay: 1&nbsp; &nbsp; Code page:&nbsp; &nbsp; &nbsp; 65001“列”行以字符为单位说明窗口宽度。(注意:此输出是特定于语言环境的。您可能会得到“Columnas”或“Oszlopok”等)然后让我们解析该数字:preg_match('~Columns:\s+(\d+)~', $info, $match);$columns = $match[1] ?? null;如果数据可用,该$columns变量将包含当前命令提示符终端的字符宽度。如果没有,请设置默认宽度(此处简单为“null”)。该解决方案仅适用于 Windows 命令提示符和 Power Shell 上的 PHP CLI;或支持该MODE命令的其他(大概是 Microsoft)终端应用程序。如果可以选择调用 PowerShell,还有一种更简洁的替代方法来获取列宽。列大小/字符宽度存储在 PS$Host对象中:// Returns the number of columns:$columns = shell_exec('powershell $Host.UI.RawUI.WindowSize.Width');对于其他平台,您必须找到等效的命令。在bash中,等效项是tput cols(返回列数)。如下:$columns = shell_exec('tput cols');此 bash 命令也适用于 MacOS 和 CygWin(均经过测试)。够简单的!读者:请随时添加有关在其他平台获取此数据的注释。将融入答案。
随时随地看视频慕课网APP
我要回答