Wie bekomme ich die Linux-Konsole $ COLUMNS und $ ROWS von PHP CLI?

Lesezeit: 5 Minuten

Benutzer-Avatar
SchizoDuckie

Ich erstelle gerade eine neue ordentliche CLI-Bibliothek für PHP und möchte die Breite/Höhe der Konsole herausfinden, in der sie ausgeführt wird.

Ich habe viele Dinge ausprobiert, wie das Durchsuchen von $_ENV, exec(“echo $COLUMNS”) usw., aber kein Ergebnis, während wenn ich echo $COLUMNS oder $ROWS in die Bash-Befehlszeile eingebe, der Wert ordentlich angezeigt wird.

Was muss ich tun, um von PHP aus auf diesen Wert zuzugreifen?

Ich verwende .sh-Skripte wie folgt:

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

require_once('lib.commandline.php');


class HelloWorld extends CommandLineApp {

  public function main($args) {

       echo('O, Hai.');

    }

}

Aktualisieren
Endgültige Lösung:

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];
      }
    }

  • Also ähm… Mir ist klar, dass es fast 10 Jahre her ist, aber hast du immer noch diese CLI-Bibliothek? GitHub? 🙂

    – MSpreis

    20. September 2019 um 22:40 Uhr

Eine weitere Shell-Option, die keine Analyse erfordert, ist tput:

$this->settings['screen']['width'] = exec('tput cols')
$this->settings['screen']['height'] = exec('tput lines')

  • Ausgezeichnet. Ich habe es total vergessen tput während Sie suchen, wie Sie genau diese Informationen erhalten stty.

    – Joe Koberg

    5. Februar 2010 um 2:50 Uhr

  • Super! Sehr nützliche und sanfte Erinnerung daran, wie elegant eine Lösung sein kann.

    – Paul T. Rawkeen

    19. November 2013 um 20:25 Uhr

  • Diese Lösung funktioniert sogar unter Windows, wenn Sie Git für Windows installieren. Die Alternative ist zu parsen mode con /status.

    – David Refoua

    13. Oktober 2016 um 12:44 Uhr

  • Als Hinweis: Der von tput zurückgegebene Wert wird nach der Größenänderung des Fensters nicht aktualisiert, aber stty wird es tun

    – pmiguelpinto

    23. Dezember 2020 um 17:48 Uhr

  • @pmiguelpinto: Wieso? Es scheint für mich zu funktionieren.

    – Dennis Williamson

    27. Juni um 20:28 Uhr

Benutzer-Avatar
Jo Koberg

Verwenden Sie das PHP ncurses_getmaxyx Funktion.

ncurses_getmaxyx (STDSCR, $Height, $Width)

BISHER:

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

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

Der “richtige” Weg ist wohl der Aufruf TIOCGSIZE ioctl, um die Vorstellung des Kernels von der Fenstergröße zu erhalten, oder rufen Sie den Befehl auf stty -a und analysieren Sie die Ergebnisse für rows und columns

  • Ich möchte nur sagen, dass COLUMNS & ROWS nicht in Terminal.app unter Mac OS X festgelegt sind. Ich hatte auch Probleme damit, dass diese inkonsistent sind (z. B. funktionierten sie in irb, aber nicht beim Ausführen eines Ruby-Skripts usw.).

    – Jeffrey Aylesworth

    4. Februar 2010 um 21:49 Uhr

  • Die Umgebungsvariablen werden auch nicht aktualisiert, wenn die Größe des Terminals geändert wird, während Ihr Programm ausgeführt wird.

    – vergänglich

    4. Februar 2010 um 22:01 Uhr

  • Getenv funktioniert tatsächlich nicht, $_ENV auch nicht. Aber danke für den Hinweis auf stty -a, ich werde das analysieren 🙂

    – SchizoDuckie

    4. Februar 2010 um 22:25 Uhr

  • Ich mag die Portabilität meiner aktuellen Lösung 🙂 Nicht alle Boxen haben ncurses in PHP, also möchte ich, dass es so einfach wie möglich ist

    – SchizoDuckie

    4. Februar 2010 um 23:31 Uhr

  • Angesichts der Tatsache, dass Sie der Gewinner dieser Frage sind und dass Ihr Top-Vorschlag derzeit eine „EXPERIMENTELLE“ Funktion ist (ihre Großbuchstaben, nicht meine), könnten Sie sich einen Moment Zeit nehmen und die verschiedenen Methoden hier konsolidieren und die tatsächlich richtige Antwort zeigen. Zumal Sie auf die ioctl-Methode als bevorzugte Methode anspielen (ohne zu sagen, warum sie die beste ist), aber Sie zeigen nicht wirklich, wie das geht. ANMERKUNG AN SELBST: Anstatt sich darüber zu beschweren, warten Sie sechs Monate und schreiben Sie eine wirklich gute Antwort. Denken Sie daran, Joe dafür zu danken, dass er eine Antwort geschrieben hat, anstatt nur zu gehorchen …

    – ftrotter

    18. September 2017 um 6:29 Uhr


$COLUMNS und $LINES wird wahrscheinlich nicht in Ihr Programm exportiert. Du kannst rennen export LINES COLUMNS bevor Sie Ihre App ausführen, oder Sie können diese Informationen direkt abrufen:

$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);

Ich weiß nicht, wozu man das überhaupt brauchen sollte grep zu analysieren stty Ausgabe: Es gibt eine separate Option, um “die Anzahl der Zeilen und Spalten gemäß dem Kernel” zu melden.

Einzeiler, keine Fehlerbehandlung:

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

Einzeiler, bei Problemen beide Zeilen/Spalten auf 0 setzen und eventuelle Fehlerausgaben unterdrücken:

list($rows, $cols) = explode(' ', @exec('stty size 2>/dev/null') ?: '0 0');

Benutzer-Avatar
t0mm13b

Vielleicht das Verknüpfung könnte die Antwort sein, Sie könnten dafür die ANSI-Escape-Codes verwenden, indem Sie die verwenden echo unter Verwendung der spezifischen Escape-Code-Sequenz, insbesondere des ‘Query Device’, das ich unter einem anderen Link gefunden habe hier das erklärt ausführlich. Vielleicht können Sie damit die Spalten und Zeilen des Bildschirms abrufen …

  • Diese Antwort weist auf 2 Links hin, die tot sind. Diese Antwort erklärt auch nicht, wie die Konsolengröße nach dem Senden der Escape-Sequenz abgerufen wird.

    – Ismael Miguel

    17. Januar um 7:18 Uhr

Benutzer-Avatar
Magallanen

Fürs Protokoll, es ist meine Funktion (PHP 7.2 und höher):

Es funktioniert unter Windows und Linux. Im Fehlerfall wird 80 zurückgegeben.

Im Falle eines verrückten oder zu kleinen Werts wird der Mindestwert (80) zurückgegeben.

ps: “mode con” gibt zwar die Anzahl der Zeilen zurück, basiert aber auf dem Puffer als auf der Bildschirmgröße.

ps2: Seltsamerweise, aber wenn ich es als Website ausführe, gibt es 120 (Windows Host) zurück.

   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;
        }
    }

  • Diese Antwort weist auf 2 Links hin, die tot sind. Diese Antwort erklärt auch nicht, wie die Konsolengröße nach dem Senden der Escape-Sequenz abgerufen wird.

    – Ismael Miguel

    17. Januar um 7:18 Uhr

Benutzer-Avatar
Johannes

Umgebungsvariablen finden Sie in der superglobalen Variablen $_ENV.

echo $_ENV['ROWS'];

zum Beispiel.

  • “Ich habe viele Dinge versucht, wie das Durchsuchen von $_ENV, exec(“echo $COLUMNS”) usw., aber kein Ergebnis”, sagte der Poster.

    – MAChitgarha

    1. Februar 2019 um 9:52 Uhr

1092720cookie-checkWie bekomme ich die Linux-Konsole $ COLUMNS und $ ROWS von PHP CLI?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy