粘贴长字符串到textarea的长度校验失效问题如何解决?
问题原因及修复方案
核心原因
- 对
exec()函数的返回值结构理解错误:PHP的exec()第二个参数$return是数组类型,每个元素对应Python脚本输出的一行内容。你调用reset($return)仅获取了数组的第一个元素(即第一行输出),计算的只是单一行的长度,不是所有输出的总长度,因此无法正确拦截整体超长的输出。 - 阈值冗余不足:你设置的8000000字节距离默认
post_max_size的8388608字节(8M)仅余388KB,还要预留表单其他字段、HTTP请求表单分隔符、implode拼接时新增的分隔符(如换行符)的字节开销,很容易出现判断通过但提交仍超限的情况。
修复代码
你可以先统计所有输出行的总字节数,再加上拼接时的额外开销做判断,同时调低阈值留足冗余:
exec("python ../syslog_webUI/build_search_function.py $parameters", $return); // 计算所有输出行的总字节数 + implode用换行符拼接的额外字节开销 $total_len = array_sum(array_map('strlen', $return)) + max(0, count($return) - 1); // 阈值调整为7M(7*1024*1024=7340032字节),预留足够冗余 if ($total_len < 7340032) { $vals = $return; } else { $vals[] = "Output too long!"; }
补充说明
- 统计长度直接用PHP原生
strlen()即可,不要使用mb_strlen:前者返回的是字节数,和POST Content-Length的统计规则一致,后者返回的是多字节字符数,计算结果会偏小,导致判断不准。 - 如果Python脚本输出本身过大,也可以直接在Python脚本中增加输出长度限制,超过阈值直接返回超长提示,减少PHP侧的内存和计算开销。
内容的提问来源于stack exchange,提问作者Michele
相关产品推荐
相关产品推荐

