Я пишу 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.
Два предложения:
Подсчитайте фактическое количество элементов в массиве и посмотрите, соответствует ли массив правильному количеству записей (поэтому исключение или идентификация print_r()
в качестве виновника)
Проверьте вход … любой шанс, что окончание строки в файле вызывает проблему? Например, существует ли смесь разных типов строк? См. Также страницу руководства для 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-страницу, но я не уверен, что это такое.