Максимальное количество ключей для массива в php

Я пишу php script, где я вызываю

$lines = file('base_list.txt');

чтобы разбить файл на массив. Файл содержит более 100 000 строк, которые должны быть 100 000 элементов в массиве, но когда я запускаю

print_r($lines);
exit;

массив содержит только 7280 элементов.

Так что мне любопытно, WTF? Есть ли ограничение на количество ключей, которые может иметь массив? Я запускаю это локально на двухъядерном 2.0 ГГц с 2 ГБ оперативной памяти (Vista и IIS, хотя); поэтому я немного запутался в том, как файл размером 4 МБ может выдавать такие результаты.

Изменить: Вероятно, я должен был упомянуть, что ранее я установил memory_limit в 512 Мбайт в php.ini.

Ответ 1

Дэррил Хейн,

Да, в журналах ошибок ничего нет. Я даже увеличил отчет об ошибках и все еще ничего не имею в виду print_r().

В ответ на Джей: Я побежал

echo count($lines);

и я получаю результат 105 546, но все еще print_r() отображает только 7280.

Взяв совет Роба Уокер, я зациклился на всех элементах массива и на самом деле содержал все результаты. Это заставляет меня думать, что проблема связана с самим print_r(), а не с ограничением на размер массива.

Еще одна странность в том, что я попробовал это на одном из моих серверов REHL, и результат был таким, какой он есть. Теперь я не хочу винить это в Windows/IIS, но там вы идете.

С учетом вышеизложенного я думаю, что этот вопрос должен быть переименован, поскольку он больше не относится к массивам, а print_r.

Ответ 2

Изменить: как сказал Роб, если ваше приложение исчерпало память, скорее всего, он даже не попадет в строку print_r. Это тоже моя догадка, но если это проблема с памятью, это может помочь.

Посмотрите в файле php.ini для этой строки и, возможно, увеличьте ее до 16 или более.

memory_limit = 8M

Если у вас нет доступа к php.ini(например, если это происходит на общем сервере), вы можете исправить его с помощью файла .htaccess, подобного этому

php_value memory_limit 16M

По-видимому, некоторые хосты не позволяют вам это делать.

Ответ 3

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

Ответ 4

Два предложения:

  • Подсчитайте фактическое количество элементов в массиве и посмотрите, соответствует ли массив правильному количеству записей (поэтому исключение или идентификация print_r() в качестве виновника)

  • Проверьте вход... любой шанс, что строки в файле вызвали проблему? Например, существует ли смесь разных типов строк? См. Справочную страницу для file() и примечание о настройке auto_detect_line_endings, хотя маловероятно, что это связано с окончанием строки в Mac.

Ответ 5

Я полагаю, что он основан на количестве доступной памяти, установленной в файле php.ini.

Ответ 6

каждый раз, когда у меня заканчивается память в PHP, я получил сообщение об ошибке, сообщающее об этом. Итак, я бы также сказал, что если у вас заканчивается память, то script не попадет в print_r()

попробуйте включить auto_detect_line_endings в php.ini или используя ini_set('auto_detect_line_endings', 1). Могут быть некоторые окончания строк, которые окна не понимают, и этот параметр ini может помочь. более подробную информацию об этом варианте ini можно найти здесь

Ответ 7

Вы должны использовать count для подсчета количества элементов в массиве, а не print_r. Что делать, если вывод этого большого массива был прерван из-за тайм-аутов или чего-то еще? Или некоторая ошибка/функция в print_r?

Ответ 8

Функция PHP print_r имеет ограничения. Однако, даже если вы не видите "весь" массив, все это есть. Я столкнулся с этой проблемой при печати больших объектов данных.

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

foreach ($FileLines as $Line) echo $Line;

Это позволит вам видеть все строки без ограничений.

Ответ 9

Я соглашусь с Кори. Я думаю, что ваш PHP, вероятно, настроил память по умолчанию на 8 МБ, а 4 Мб x 2 уже больше. Причина для x2 заключается в том, что вам нужно загрузить файл, а затем создать массив, в котором вам понадобится иметь файл в памяти. Я просто догадываюсь, но это имело бы смысл.

Вы уверены, что PHP не регистрирует ошибку?

Ответ 10

Если вы выводите что-то вроде Internet Explorer, вы можете убедиться, что он может отображать всю информацию, которую вы пытаетесь установить там. Я знаю, что существует ограничение на html-страницу, но я не уверен, что это такое.