2010-02-04 4 views
17

Attualmente sto creando una nuova libreria CLI per PHP, e mi piacerebbe capire la larghezza/altezza della console in cui è in esecuzione.

Ho provato molte cose come scavare attraverso $ _ENV, exec ("echo $ COLUMNS"), ecc., ma nessun risultato, mentre se digito echo $ COLUMNS o $ ROWS nella riga di comando bash, mostra in modo preciso il valore.

Cosa devo fare per accedere a questo valore da PHP?

che sto utilizzando script .sh in questo modo:

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

require_once('lib.commandline.php'); 


class HelloWorld extends CommandLineApp { 

    public function main($args) { 

     echo('O, Hai.'); 

    } 

} 

Aggiornamento soluzione finale:

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

risposta

38

Un'altra opzione di shell che non richiede l'analisi è tput:

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

eccellente. Mi sono completamente dimenticato di 'tput' mentre scavo per ottenere solo le informazioni da' stty'. –

+0

Fantastico, ancora meglio! – SchizoDuckie

+0

Super! Promemoria molto utile e gentile su come può essere elegante la soluzione. –

4

Utilizzare la funzione PHP ncurses_getmaxyx.

ncurses_getmaxyx (STDSCR, $Height, $Width) 

PRECEDENTI:

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

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

Il modo "corretto" è probabilmente di chiamare il TIOCGSIZE ioctl per avere un'idea del kernel della dimensione della finestra, oppure chiamare il comando stty -a e analizzare i risultati per rows e columns

+0

@ Joe: Dang !!!! Me ne sono completamente dimenticato e ho postato una risposta schifosa !!! :) LOL – t0mm13b

+0

Voglio solo dire che COLUMNS & ROWS non sono impostati in Terminal.app su Mac OS X. Ho anche avuto problemi con quelli che sono incoerenti (ad esempio, hanno funzionato in irb, ma non quando si esegue uno script ruby , & c). –

+0

Anche le variabili di ambiente non vengono aggiornate se il terminale viene ridimensionato mentre il programma è in esecuzione. – ephemient

1

Forse questa link potrebbe essere la risposta, è possibile utilizzare i codici di escape ANSI per fare ciò, utilizzando lo echo utilizzando la sequenza di codice Escape specifica, in particolare il "Dispositivo di query", che ho trovato un altro collegamento here che spiega in dettaglio . Forse utilizzarlo potrebbe consentire di ottenere le colonne e le righe dello schermo ...

0

Le variabili di ambiente possono essere trovate nella variabile globale $ _ENV super.

echo $_ENV['ROWS']; 

per esempio.

2

$COLUMNS e $LINES probabilmente non viene esportato nel programma. È possibile eseguire export LINES COLUMNS prima di eseguire la vostra applicazione, o si può ottenere direttamente le informazioni:

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