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

Я пишу php-скрипт, где я звоню

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

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

 print_r($lines); exit; 

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

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

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

Дэррил Хейн,

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

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

 echo count($lines); 

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

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

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

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

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

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

 memory_limit = 8M 

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

 php_value memory_limit 16M 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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