最直接方式是file_get_contents+strlen/substr_count适合小文件,大文件应逐行fgets读取以节省内存,并用正则或统一换行符处理兼容性问题。

用PHP统计文件行数和字符数,最直接的方式是读取文件内容后用内置函数处理。关键在于选择合适的方法——既要准确,又要兼顾大文件的内存安全。
基础方法:file_get_contents + strlen / substr_count
适合小文件(几MB以内),代码简洁易懂:
- 字符数:用 strlen(file_get_contents($file)) 即可获取总字节数(注意:UTF-8中文算3字节,如需“字符数”而非“字节数”,得用 mb_strlen($content, 'UTF-8'))
- 行数:用 substr_count($content, "\n") + 1(末尾无换行时仍算1行;若文件为空,结果为1,需单独判断)
内存友好法:逐行读取(fgets)
处理大文件(百MB以上)时避免内存溢出,推荐用 fgets 流式读取:
- 打开文件句柄 $fp = fopen($file, 'r')
- 循环 while (($line = fgets($fp)) !== false),每读一行,行数+1,字符数累加 strlen($line)
- 记得 fclose($fp),否则资源泄漏
更精确的行数统计(兼容不同换行符)
Windows(\r\n)、Mac(\r)、Unix(\n)换行不统一,substr_count 可能漏计。稳妥做法:
- 用正则匹配所有换行符:preg_match_all('/\r\n|\r|\n/', $content, $matches),再加1
- 或统一替换后再计数:$normalized = str_replace(["\r\n", "\r"], "\n", $content); $lines = substr_count($normalized, "\n") + 1;
一行命令式封装(实用小函数)
把逻辑打包成函数,调用更清爽:
function file_stats($file) {
if (!is_file($file) || !is_readable($file)) {
return ['lines' => 0, 'chars' => 0];
}
$lines = 0;
$chars = 0;
$fp = fopen($file, 'r');
while (($line = fgets($fp)) !== false) {
$lines++;
$chars += strlen($line);
}
fclose($fp);
return ['lines' => $lines, 'chars' => $chars];
}
// 使用:$stats = file_stats('log.txt'); echo "行数:{$stats['lines']}, 字符数:{$stats['chars']}";php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











