【发布时间】:2019-07-11 01:04:39
【问题描述】:
我有一个循环遍历一个大数组$result。每个数组项$row 用于生成一个新的字符串行$line。这个字符串被连接成$str。为了保留内存,我使用unset($result[$i]) 来清除原始数组中已处理的每个数组项。这看起来像这样:
$resultcount = count($result);
for($i=0; $i<$resultcount; ++$i){
$row = $result[$i];
$line = do_something($row);
$str.= '<tr><td>'.$line.'</td></tr>';
unset($result[$i]);
}
return $str;
除非字符串的长度超过大约1'000'000 个字符。在这种情况下,返回值只是空的。这非常令人恼火,因为:
- 计算工作量(在本例中为
do_something())不是问题。通过使用echo count($result).' - '.strlen($str)."\n",我可以看到循环正确完成。没有显示 Web 服务器或 php 错误。 -
memory_limit也不是问题。我正在处理应用程序其他部分的更多数据。
看来问题出在return $str 本身。如果我使用return substr($str, 0, 980000),那么它就可以正常工作。进一步调试表明,字符串一旦达到 999'775 字节的长度就会被污染。
我不能将更长的返回值字符串放入另一个字符串变量中。但我可以通过strlen() 获得正确的结果(1310307)。所以返回值字符串的总长度为 1'310'307 个字节。但是我不能正确地将它们用作字符串。
这个限制来自哪里,我该如何规避它?
【问题讨论】:
-
不要从后端发送 HTML。仅以 JSON 格式发送数据并使用 javascript 在前端制作表格。这种方式也可以更快地完成请求,因为通过网络发送到客户端浏览器的字节数会更少。
-
使用查询或使用 array_filter [php.net/manual/en/function.array-filter.php] 提高处理速度的结果数组应用分页或过滤器。
标签: php arrays string return return-value