Возможно ли включить escape-коды VT100 / ANSI из PHP 5 в Windows? - PullRequest
3 голосов
/ 09 ноября 2019

Я нахожусь в процессе обновления старого приложения PHP 5 до PHP 7. Я использую Codeception для модульного тестирования, потому что у него хороший вывод цвета, что позволяет легко увидеть, прошли ли все тесты или нет.

Вещи, которые я пробовал:

  • Обновление до PHP 7: происходит сбой приложения
  • Запуск Codeception без специальных флагов: коды выхода ANSI выводятся на экран для выводатрудно читаемое
  • Выполнить Codeception с флагом --no-colors: вывод - это один цвет, требующий больше времени для распознавания проходного прохода 100% или неудачных тестов
  • Используйте ANSICON вместо Windows CommandПодсказка: PHP 5 работает невероятно медленно, для создания отчета с покрытием требуется час, когда тот же запуск под командной строкой занимает всего 2 минуты

Вещи, которые я не пробовал:

  • Установка значения реестра таким образом, чтобы экранирующие коды ANSI всегда были включены, если только не запущена запущенной программой: это решение не переносимо для других разработчиков

Я бынравится делать то же самое, что и исходный код, указанный ниже, за исключением PHP. Что-то вроде:

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

Я понятия не имею, возможно ли вообще выдавать команды для API командной строки из PHP.

Следующий код C взят из PHP 7source :

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?

Я нашел следующие связанные вопросы, но я все еще не ближедаже до начала:

...