PHP 7.4 需安装 league/csv:^8.3,PHP 8.0+ 可直接装最新版;读取时用 Reader::createFromPath() 并设 'r' 模式,处理 BOM 需 addFilter 或手动跳过,迭代须 try/catch 防崩。

直接用 composer require league/csv 就能装,但默认装的是 v9+(PHP 8.0+),如果你用 PHP 7.4 或更低版本,会报错或装不上。
确认 PHP 版本再选对版本号
League/Csv 的 v9 要求 PHP ≥ 8.0;v8 支持 PHP 7.2–7.4;v7 已废弃且不安全。装错版本会导致 Class 'League\Csv\Reader' not found 或 Composer 直接拒绝安装。
- 运行
php -v查看当前 PHP 版本 - PHP 8.0+:直接
composer require league/csv - PHP 7.4:必须指定
composer require league/csv:^8.3(^8.3是最后一个支持 7.4 的小版本) - PHP 7.2–7.3:用
composer require league/csv:^8.0
读取 CSV 文件的基本写法(别漏掉 use)
装完后不能直接 new Reader,得先 use 对应类,而且 v9 和 v8 的命名空间一致,但构造方式略有不同——v9 推荐用 Reader::createFromPath(),v8 也支持但文档更倾向 new Reader()。
- 推荐统一写法(兼容 v8/v9):
use League\Csv\Reader; $csv = Reader::createFromPath('/path/to/data.csv', 'r'); $csv->setDelimiter(','); // 显式设分隔符更稳妥 foreach ($csv as $row) { echo $row[0] ?? '' . PHP_EOL; } - 如果用
new Reader(),v8 没问题,v9 仍可用但已标记为 legacy;v9 中new Reader()不再接受文件路径参数,必须传Stream实例 - 常见坑:
createFromPath()第二个参数必须是'r'(只读),写成'rb'或空字符串会导致Invalid stream resource
处理带 BOM 的 UTF-8 CSV 文件
Windows Excel 导出的 CSV 经常带 UTF-8 BOM(\xEF\xBB\xBF),不处理会导致第一列字段名开头多出乱码,比如 name。
- 在
createFromPath()后加一行:$csv->addFilter('convert.iconv.UTF-8//IGNORE');(v8/v9 都支持) - 更彻底的做法:用
fopen手动跳过 BOM 再传 Stream:$handle = fopen('/path/to/data.csv', 'r'); if (fgets($handle, 4) !== "\xEF\xBB\xBF") fseek($handle, 0); $csv = Reader::createFromStream($handle); - 别依赖
mb_convert_encoding()在读取后清理——BOM 影响的是字段名解析,不是内容本身
真正麻烦的不是安装,而是 CSV 编码、BOM、换行符混用(\r\n vs \n)和引号转义逻辑——这些细节 League/Csv 虽然封装了,但一旦原始文件不规范,foreach 迭代时就可能崩在某一行,最好加 try/catch 包住单行处理。










