PHP 8.2.1执行.phar文件时出现fgets() I/O错误求助
问题分析与解决思路
问题背景
在Termux环境下使用PHP 8.2.1执行PocketMine-MP.phar时,运行数行输出后触发fgets(): Read of 8192 bytes failed with errno=5 I/O error错误,进程终止;但PHP 8.1及Windows CMD环境下运行正常。
可能原因与解决方法
PHP 8.2标准输入处理变更
PHP 8.2对php://stdin的读取逻辑做了更严格的状态校验,Termux终端的tty交互机制可能触发了新的错误检测。可修改phar:///data/data/com.termux/files/home/PocketMine-MP.phar/src/console/ConsoleReader.php第67行的代码,增加错误处理逻辑:$line = @fgets($this->stdin, 8192); if($line === false && !feof($this->stdin)) { // 重试打开标准输入 $this->stdin = fopen('php://stdin', 'r'); continue; }Termux终端环境兼容性
Termux的底层终端库可能与PHP 8.2的stdin读取存在兼容性问题:- 尝试更新Termux系统包:
pkg upgrade - 切换终端模拟器(如使用Termux:X11替代默认终端)
- 用
screen或tmux后台运行进程,避免终端会话的I/O中断
- 尝试更新Termux系统包:
Phar文件权限或扩展配置
- 检查Phar文件权限:
chmod 755 PocketMine-MP.phar - 确认PHP 8.2的
phar.readonly配置为Off(可在php.ini中修改或运行时用ini_set('phar.readonly', 0))
- 检查Phar文件权限:
临时规避方案
若无需控制台交互,可重定向stdin避免错误:php PocketMine-MP.phar < /dev/null
内容的提问来源于stack exchange,提问作者kpwn Apps
相关产品推荐
相关产品推荐

