Возвращаемая длинная строка PHP не может использоваться как строка - PullRequest
0 голосов
/ 17 февраля 2019

У меня цикл 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 символов.В этом случае возвращаемое значение просто пустое.Это очень раздражает, потому что:

  1. Расчетное усилие (в этом примере do_something()) не является проблемой.Используя echo count($result).' - '.strlen($str)."\n", я вижу, что цикл завершается правильно.Не отображается веб-сервер или ошибка php.
  2. memory_limit также не является проблемой.Я работаю с другими данными в других частях приложения.

Похоже, что проблема заключается в самом return $str.Если я использую return substr($str, 0, 980000), то он просто отлично работает.Дальнейшая отладка показывает, что строка становится испорченной, как только она достигает длины 999 775 байт.

Я не могу поместить более длинную строку возвращаемого значения в другую строковую переменную.Но я могу сделать strlen(), чтобы получить правильный результат (1310307).Таким образом, строка возвращаемого значения имеет общую длину 1'310'307 байт.Но я не могу использовать их как строку.

Откуда это ограничение и как я могу его обойти?

1 Ответ

0 голосов
/ 24 февраля 2019

Вы, кажется, описываете возвращаемое значение противоречивым образом:

В этом случае возвращаемое значение просто пустое.

, но

Но я могу сделать strlen (), чтобы получить правильный результат (1310307).Таким образом, строка возвращаемого значения имеет общую длину 1'310'307 байт.

Что-то не может быть пустым и иметь длину одновременно?

Я тестировал возвратдлинная строка, и она прекрасно работает для меня.Возврат больших и больших строк работает до превышения предела памяти точки, что вызывает явную фатальную ошибку.

С технической стороны строки могут быть намного больше миллиона символов:

Примечание: Начиная с PHP 7.0.0, нет никаких особых ограничений относительно длины строки в 64-битных сборках.В 32-разрядных сборках и в более ранних версиях строка может достигать 2 ГБ (максимум 2147483647 байт) http://php.net/manual/en/language.types.string.php

Я подозреваю, что сбойная операция связана с тем, как вы используйте результат вместо возврата из функции.

...