4

古い PHP 5 アプリを PHP 7 にアップグレード中です。単体テストに Codeception を使用しています。これはカラー出力が優れているため、すべてのテストに合格したかどうかを簡単に確認できます。

私が試したこと:

  • PHP 7 へのアップグレード: アプリがクラッシュする
  • 特別なフラグなしで Codeception を実行します。ANSI エスケープ コードが画面に出力され、出力が読みにくくなります。
  • フラグを指定して Codeception を実行します--no-colors: 出力は単一の色で、100% 成功した実行を認識するのに時間がかかります。または、どのテストが失敗したかを認識します。
  • Windows コマンド プロンプトの代わりに ANSICON を使用します。PHP 5 の実行は非常に遅く、コマンド プロンプトでの同じ実行には 2 分しかかからないのに、レポートを作成するのに 1 時間かかります。

私が試していないこと:

  • 実行中のプログラムによってオフにされない限り、ANSI エスケープ コードが常にオンになるようにレジストリ値を設定します。このソリューションは、他の開発者には移植できません。

PHP内を除いて、以下にリストされているソースコードと同じことをしたいと思います。何かのようなもの:

if (is_windows_console()) {
  if (has_vt100_extensions()) {
    if (are_vt100_extensions_disabled()) {
      vt100_extensions->on();
    }
  }
}

PHP 内からコマンド プロンプト API にコマンドを発行することさえ可能かどうかはわかりません。

次の C コードは、PHP 7 ソースからのものです。

PHP_WINUTIL_API BOOL php_win32_console_fileno_set_vt100(zend_long fileno, BOOL enable)
{
    BOOL result = FALSE;
    HANDLE handle = (HANDLE) _get_osfhandle(fileno);

    if (handle != INVALID_HANDLE_VALUE) {
        DWORD events;

        if (fileno != 0 && !GetNumberOfConsoleInputEvents(handle, &events)) {
            // Not STDIN
            DWORD mode;

            if (GetConsoleMode(handle, &mode)) {
                DWORD newMode;

                if (enable) {
                    newMode = mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING;
                }
                else {
                    newMode = mode & ~ENABLE_VIRTUAL_TERMINAL_PROCESSING;
                }
                if (newMode == mode) {
                    result = TRUE;
                }
                else {
                    if (SetConsoleMode(handle, newMode)) {
                        result = TRUE;
                    }
                }
            }
        }
    }
    return result;
}

PHP 5 スクリプト内からこの機能をエミュレートする方法はありますか?

次の関連する質問を見つけましたが、まだ開始に近づいていません。

4

0 に答える 0