PHP
ターミナル
cli

PHP の CLI でスクリーンの横幅と高さを取得するサンプル(罫線を引く)

PHP で、シェル/ターミナル/コマンドラインの画面の横幅や高さを取得するサンプルです。

シェルで<HR>(水平線)を表現する方法各種」を活用して、PHP で CLI アプリを作成する際に画面サイズ(1行の文字数と画面の行数)を取得できるようになります。

これにより画面横幅いっぱいの横線を描画したりできます。

TL;DR(ポイント)

シェルの tput コマンドを PHP でパース(PHP 内から実行して、その結果を取得)します。

<?php

$screen_width_default = 70;
$screen_width_system  = `tput cols`; // バッククォート注意。`exec` だと正常に取得できない

$screen_width = $screen_width_system ?: $screen_width_default;

echo srt_repeat('-', $screen_width), PHP_EOL;

TS;DR

サンプルで使われているユーザ関数

関数名 内容 備考
get_hr() 指定文字の罫線(1行ぶん繰り返した文字列)を返す 罫線の文字のデフォルトは'='
get_screen_width() スクリーンの横幅(1行の文字数)を返す 取得できない場合はデフォルト値を返します
get_screen_height() スクリーンの高さ(画面の行数)を返す 取得できない場合はデフォルト値を返します
is_cli() CLI で実行しているか返す 呼び出し元がWEBサーバーの場合はfalseを返します

サンプル・コード

sample_cli.php
<?php

/* サンプル */

echo get_hr() . PHP_EOL; //画面横幅いっぱいに横線を描画する
echo get_screen_width() . PHP_EOL; //ターミナルの横幅(1行の文字数)を出力
echo get_screen_height() . PHP_EOL; //ターミナルの高さ(画面の行数)を出力
echo (is_cli()) ? 'CLIです' . PHP_EOL : '<p>CLIではありません</p>' . PHP_EOL; //CLIの判断

/* 関数 */

function get_hr($hr_char = '=')
{
    $width = get_screen_width();

    if ('n/a' == $width) {
        return '<hr />';
    } else {
        return str_repeat($hr_char, $width);
    }
}

function get_screen_width()
{
    $default_width = 70; //デフォルト幅

    if (! is_cli()) {
        return 'n/a';
    }
    $width = trim(`tput cols`); //バッククォートであることに注意

    return is_numeric($width) ? (int) $width : $default_width;
}

function get_screen_height()
{
    $default_height = 40; //デフォルト幅

    if (! is_cli()) {
        return 'n/a';
    }
    $height= trim(`tput lines`); //バッククォートであることに注意

    return is_numeric($height) ? $height : $default_height;
}


function is_cli()
{
    return PHP_SAPI === 'cli' || empty($_SERVER['REMOTE_ADDR']);
}

出力結果

$ php ./sample_cli.php
================================================================================
86
24
CLIです
  • 1行目:WEBからのアクセスの場合は "<hr />" が返されます
  • 2行目:CLI からのアクセスの場合で幅を取得できた場合の横幅(1行の長さ)の値
  • 3行目:CLI からのアクセスの場合で高さを取得できた場合の高さ(画面の行数)の値
  • 4行目:CLI 経由での実行か否かの結果

検証済み環境

  • macOS HighSierra: OSX 10.13.6
  • bash --version: GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin17)
  • php -v: PHP 7.2.6 (cli) (built: May 25 2018 06:18:43) ( NTS )