PHP返回长字符串不能用作字符串

时间:2019-02-17 13:42:26

标签: php arrays string return return-value

我有一个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个字符。在这种情况下,返回值只是空的。这非常令人讨厌,因为:

  1. 计算工作量(在此示例中为do_something())不是问题。通过使用echo count($result).' - '.strlen($str)."\n",我可以看到循环正确完成了。没有显示Web服务器或php错误。
  2. memory_limit也不是问题。我正在处理应用程序其他部分的更多数据。

问题似乎出在return $str本身。如果我使用的是return substr($str, 0, 980000),那就可以了。进一步的调试显示,该字符串一旦达到999'775字节的长度,就会被污染。

我不能将更长的返回值字符串放入另一个字符串变量中。但是我可以执行strlen()以获得正确的结果(1310307)。因此,返回值字符串的总长度为1'310'307字节。但是我不能正确地将它们用作字符串。

此限制来自何处,我该如何规避?

1 个答案:

答案 0 :(得分:0)

您似乎用相反的方式描述返回值:

  

在这种情况下,返回值只是空的。

但是

  

但是我能够执行strlen()以获得正确的结果(1310307)。因此,返回值字符串的总长度为1'310'307字节。

有什么东西不能同时为空并且有长度?

我已经测试过返回一个长的字符串,它对我来说很好用。返回越来越大的字符串会超过点存储限制,这将触发显式致命错误。

从技术角度讲,字符串可以很多超过百万个字符:

  

注意:从PHP 7.0.0开始,对于64位版本中的字符串长度没有特殊限制。在32位版本和较早版本中,字符串最大可以为2GB(最大2147483647字节)   http://php.net/manual/en/language.types.string.php

我怀疑失败的操作与您使用结果的方式有关,而不是从函数返回的结果。