26

私は現在、PHP用の新しいきちんとしたCLIライブラリを作成していますが、それが実行されているコンソールの幅/高さを把握したいと思います。

$ _ENV、exec( "echo $ COLUMNS")などを掘り下げてみましたが、結果が得られませんでした。bashコマンドラインでecho $COLUMNSまたは$ROWSと入力すると、値がきれいに表示されます。

PHPからこの値にアクセスするには何をする必要がありますか?

私は次のような.shスクリプトを使用しています:

#!/usr/bin/php -q
<?php

require_once('lib.commandline.php');


class HelloWorld extends CommandLineApp {

  public function main($args) {

       echo('O, Hai.');

    }

}

最終的な解決策を更新する:

public function getScreenSize() { 
      preg_match_all("/rows.([0-9]+);.columns.([0-9]+);/", strtolower(exec('stty -a |grep columns')), $output);
      if(sizeof($output) == 3) {
        $this->settings['screen']['width'] = $output[1][0];
        $this->settings['screen']['height'] = $output[2][0];
      }
    }
4

7 に答える 7

52

解析を必要としない別のシェルオプションは次のtputとおりです。

$this->settings['screen']['width'] = exec('tput cols')
$this->settings['screen']['height'] = exec('tput lines')
于 2010-02-05T00:12:17.663 に答える
6

PHPncurses_getmaxyx関数を使用します。

ncurses_getmaxyx (STDSCR, $Height, $Width)

以前:

http://php.net/manual/en/function.getenv.php

$cols = getenv('COLUMNS');
$rows = getenv('ROWS');

「適切な」方法は、おそらくTIOCGSIZEioctlを呼び出してカーネルのウィンドウサイズの概念を取得するか、コマンドを呼び出して結果をstty -a解析することです。rowscolumns

于 2010-02-04T21:45:44.477 に答える
3

$COLUMNSおそらくプログラムに$LINESエクスポートされていません。アプリを実行するexport LINES COLUMNS前に実行することも、この情報を直接取得することもできます。

$fp=popen("resize", "r");
$b=stream_get_contents($fp);
preg_match("/COLUMNS=([0-9]+)/", $b, $matches);$columns = $matches[1];
preg_match("/LINES=([0-9]+)/", $b, $matches);$rows = $matches[1];
pclose($fp);
于 2010-02-04T21:59:12.557 に答える
2

なぜ出力grepを解析する必要があるのか​​わかりsttyません。「カーネルに応じた行と列の数」を報告するための個別のオプションがあります。

ワンライナー、エラー処理なし:

list($rows, $cols) = explode(' ', exec('stty size'));

ワンライナー、問題が発生した場合は両方の行/列を0と見なし、エラー出力を抑制します。

list($rows, $cols) = explode(' ', @exec('stty size 2>/dev/null') ?: '0 0');
于 2019-05-17T10:37:28.050 に答える
1

たぶん、このリンクが答えかもしれません。echo特定のエスケープコードシーケンス、特に「クエリデバイス」を使用することで、ANSIエスケープコードを使用してそれを行うことができます。ここで詳細を説明する別のリンクを見つけました。おそらくそれを使用すると、画面の列と行を取得できる可能性があります...

于 2010-02-04T21:46:55.050 に答える
0

ちなみに、これは私の関数(PHP 7.2以降)です。

WindowsとLinuxで動作します。エラーの場合、80を返します。

風変わりな値や小さすぎる値の場合は、最小値(80)を返します。

ps: "mode con"は行数を返しますが、画面サイズよりもバッファーに基づいています。

ps2:奇妙なことに、Webサイトとして実行すると、120(Windowsホスト)が返されます。

   function calculateColSize($min=80) {
       try {
            if (PHP_OS_FAMILY === 'Windows') {
                $a1 = shell_exec('mode con');
                /*
                 * Estado para dispositivo CON:
                 * ----------------------------
                 * Líneas:              9001
                 * Columnas:            85
                 * Ritmo del teclado:   31
                 * Retardo del teclado: 1
                 * Página de códigos:    65001
                 */
                $arr = explode("\n", $a1);
                $col = trim(explode(':', $arr[4])[1]);

            } else {
                $col = exec('tput cols');
                /*
                 * 184
                 */
            }
        } catch (Exception $ex) {
            $col = 80;
        }
    }
于 2022-02-11T14:25:50.100 に答える
-2

環境変数は、$_ENVスーパーグローバル変数にあります。

echo $_ENV['ROWS'];

例えば。

于 2010-02-04T21:48:55.000 に答える