本文目录导读:

在 PHP 项目中统计长短连接(或长/短文本、长/短请求等)的比例,首先需要明确“长”和“短”的定义标准,这里我假设你是指长文本与短文本(如文章内容、评论、用户输入等)的比例分布,或者长连接与短连接(如 HTTP Keep-Alive 长连接 vs 普通请求)。
由于这两种场景的统计方法差异极大,我将分别给出解决方案。建议你先明确具体场景,再对照以下方案实施。
统计“长文本 vs 短文本”的比例(最常用)
定义标准:通常以字符数或字节数为阈值(如:100字以内为“短”,超过100字为“长”)。
数据库查询统计(最高效,适合已有数据)
如果你的文本数据存储在 MySQL 等数据库中,可以直接用 SQL 统计,无需遍历所有 PHP 代码。
-- 假设表名为 contents,字段为 body(TEXT类型)
-- 统计长文本(>100字符)和短文本(<=100字符)的数量
SELECT
SUM(CASE WHEN CHAR_LENGTH(body) > 100 THEN 1 ELSE 0 END) AS long_count,
SUM(CASE WHEN CHAR_LENGTH(body) <= 100 THEN 1 ELSE 0 END) AS short_count,
COUNT(*) AS total_count
FROM contents;
-- 计算比例(百分比)
SELECT
ROUND(SUM(CASE WHEN CHAR_LENGTH(body) > 100 THEN 1 ELSE 0 END) / COUNT(*) * 100, 2) AS long_percent,
ROUND(SUM(CASE WHEN CHAR_LENGTH(body) <= 100 THEN 1 ELSE 0 END) / COUNT(*) * 100, 2) AS short_percent
FROM contents;
优点:速度快,不占用 PHP 内存。
缺点:需要知道具体表名和字段名。
PHP 脚本遍历统计(适合数据量小或需自定义逻辑)
如果文本数据不在数据库,而是在文件、缓存或需要动态判断,可写个 PHP CLI 脚本:
<?php
// 示例:统计数组中所有文本的长度分布
$texts = ['hello', str_repeat('x', 200), 'short', str_repeat('y', 500)];
$threshold = 100; // 长短分界线(字符)
$long = 0;
$short = 0;
foreach ($texts as $text) {
if (mb_strlen($text, 'UTF-8') > $threshold) {
$long++;
} else {
$short++;
}
}
$total = $long + $short;
echo "长文本:{$long}(" . round($long / $total * 100, 2) . "%)" . PHP_EOL;
echo "短文本:{$short}(" . round($short / $total * 100, 2) . "%)" . PHP_EOL;
?>
注意:
- 使用
mb_strlen而非strlen,避免中文按字节数误判(UTF-8下中文3字节)。 - 如果文本是用户提交的,可能需要过滤 HTML 标签后再统计。
统计“长连接 vs 短连接”(HTTP Keep-Alive)
如果是统计网络请求的长/短连接分布,通常不需要在 PHP 业务代码中统计,因为 PHP 是短生命周期进程,连接状态由 Web 服务器(Nginx/Apache)管理。
推荐统计方法:
-
Nginx/Apache 日志分析:直接分析 access.log 中的
connection字段(如有),或通过响应头判断(如Connection: keep-alive)。比如用 GoAccess 工具(
goaccess access.log)可自动生成连接统计。 -
中间件/代理层:如果使用 Redis 或 Memcached 做会话保持,可统计某时间段内的活跃连接数。
-
PHP-FPM 状态页:如果主要关注 PHP 进程的并发连接数(长连接复用),可开启
pm.status_path,通过/status接口查看active connections和总请求数,计算比例。
通用“分布”图表展示(如饼图/直方图)
无论哪种场景,统计结果最终建议可视化,推荐使用 PHP 生成 JSON 数据,前端用 Chart.js 或 ECharts 绘制:
$data = [
'labels' => ['短内容', '长内容'],
'datasets' => [['data' => [30, 70]]]
];
header('Content-Type: application/json');
echo json_encode($data);
前端接收后即可绘制饼图。
总结建议
- 文本长短比例:优先用 SQL 聚合查询(高效稳定),如果数据量较小且分散,再用 PHP 脚本遍历。
- 连接长短比例:优先检查 Web 服务器日志,避免在 PHP 层做无谓统计(性能损耗大)。
- 阈值自定义:建议将阈值(如100字符)定义为常量,方便调整,避免硬编码。
如果你能补充说明你具体想统计哪类数据(如文章评论、API请求体大小、用户停留时间等),我可以给出更有针对性的代码示例。