我有一个for循环,该循环正在大数组$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;
除非字符串的长度超过约200毫米,否则此(或多或少的异乎寻常的代码)有效。 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字节。但是我不能正确地将它们用作字符串。
此限制来自何处,我该如何规避?
答案 0 :(得分:0)
您似乎用相反的方式描述返回值:
在这种情况下,返回值只是空的。
但是
但是我能够执行strlen()以获得正确的结果(1310307)。因此,返回值字符串的总长度为1'310'307字节。
有什么东西不能同时为空并且有长度?
我已经测试过返回一个长的字符串,它对我来说很好用。返回越来越大的字符串会超过点存储限制,这将触发显式致命错误。
从技术角度讲,字符串可以很多超过百万个字符:
注意:从PHP 7.0.0开始,对于64位版本中的字符串长度没有特殊限制。在32位版本和较早版本中,字符串最大可以为2GB(最大2147483647字节) http://php.net/manual/en/language.types.string.php
我怀疑失败的操作与您使用结果的方式有关,而不是从函数返回的结果。