能否在Windows环境下通过PHP 5脚本启用VT100/ANSI转义码?
在PHP 5中模拟PHP 7的Windows控制台VT100启用功能?
我正在把一款旧的PHP 5应用升级到PHP 7,用Codeception做单元测试——主要是看中它的彩色输出,能快速判断测试有没有全过。但现在遇到了一堆麻烦:
已经尝试过的方案
- 升级到PHP 7后,直接运行应用就崩溃了,暂时没法直接切换到PHP 7环境
- 直接在Windows命令提示符中运行Codeception,ANSI转义码会被直接打印出来,输出混乱不堪,根本没法快速识别测试状态
- 使用
--no-colors参数时,输出变为单色,要分辨测试全部通过还是存在失败需要花费更长时间,完全失去了使用Codeception彩色输出的优势 - 改用ANSICON替代Windows命令提示符,但在PHP 5环境下运行速度极慢:生成带覆盖率的报告需要1小时,而在原本的命令提示符中仅需2分钟
未尝试的方案
- 修改注册表值永久启用ANSI转义码:该方案对其他开发者不具备可移植性,无法在团队中推广使用
我的需求
我希望在PHP脚本中实现PHP 7源码中下述C代码的功能,核心逻辑为:
- 判断当前是否为Windows控制台
- 检查是否支持VT100扩展
- 如果VT100扩展被禁用,则将其开启
但我不确定能否从PHP中直接调用命令提示符的API,以下是PHP 7源码中的对应C代码:
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脚本中模拟这个功能?我已经查阅过相关问题(比如如何从PHP调用WinAPI、如何创建C# DLL供PHP使用等),但仍然无从着手,求各位指点!
内容的提问来源于stack exchange,提问作者CJ Dennis
相关产品推荐
相关产品推荐

