У меня цикл 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;
Это (более или менее экзотический фрагмент кода) работает, если длина строки не превышает прибл.1'000'000 символов.В этом случае возвращаемое значение просто пустое.Это очень раздражает, потому что:
- Расчетное усилие (в этом примере
do_something()
) не является проблемой.Используя echo count($result).' - '.strlen($str)."\n"
, я вижу, что цикл завершается правильно.Не отображается веб-сервер или ошибка php. memory_limit
также не является проблемой.Я работаю с другими данными в других частях приложения.
Похоже, что проблема заключается в самом return $str
.Если я использую return substr($str, 0, 980000)
, то он просто отлично работает.Дальнейшая отладка показывает, что строка становится испорченной, как только она достигает длины 999 775 байт.
Я не могу поместить более длинную строку возвращаемого значения в другую строковую переменную.Но я могу сделать strlen()
, чтобы получить правильный результат (1310307).Таким образом, строка возвращаемого значения имеет общую длину 1'310'307 байт.Но я не могу использовать их как строку.
Откуда это ограничение и как я могу его обойти?