Максимальное количество ключей для массива в 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-страницу, но я не уверен, что это такое.