我正在写一个PHP脚本,我打电话给
$lines = file('base_list.txt');
将文件分解为数组。该文件中有超过100,000行,这应该是数组中的100,000个元素,但是当我运行
时print_r($lines);
exit;
该数组仅包含7280个元素。
所以我很好奇,WTF?数组可以拥有的密钥数量是否有限制?我在本地运行这款双核2.0Ghz,配备2GB内存(Vista和IIS虽然);所以我有点困惑4MB文件如何抛出这样的结果。
编辑: 我可能应该提到我之前在php.ini中也将memory_limit设置为512MB。
答案 0 :(得分:5)
是的,错误日志中没有任何内容。我甚至增加了错误报告,但仍与print_r()无关。
回应周杰伦: 我跑了
echo count($lines);
我得到105,546的结果但是print_r()只显示7280.
采取Rob Walker的建议我循环遍历数组中的所有元素,它实际上包含了所有结果。这让我相信问题在于print_r()本身而不是对数组大小的限制。
另一个奇怪的事情是我在我的一个REHL服务器上尝试了它,结果是应该的。现在我不想把它归咎于Windows / IIS,但你去了。
考虑到上述情况,我认为这个问题应该重新命名,因为它不再与数组相关,而是print_r。
答案 1 :(得分:4)
编辑:正如Rob所说,如果您的应用程序内存不足,很可能无法进入print_r
行。这也是我的预感,但如果 是内存问题,以下内容可能有所帮助。
在php.ini文件中查看此行,并可能将其增加到16或更多。
memory_limit = 8M
如果您无法访问php.ini(例如,如果这种情况发生在共享服务器上),您可以使用.htaccess
这样的文件进行修复
php_value memory_limit 16M
显然有些主持人不允许你这样做。
答案 2 :(得分:2)
print_r的输出是否存在固有限制?我建议在文件中查找第一行和最后一行,看看它们是否在数组中。如果您在插入数组时遇到了内存限制,那么您将永远无法访问print_r行。
答案 3 :(得分:2)
两个建议:
计算数组中的实际项目数,并查看数组是否是正确的条目数(因此消除或识别print_r()
为罪魁祸首)
验证输入...文件中的行结尾是否有可能导致问题?例如,是否有不同类型的行结尾的混合?请参阅manual page for file()
以及有关auto_detect_line_endings
设置的说明,但这不太可能与mac行结尾有关。
答案 4 :(得分:1)
我相信它是基于php.ini文件中设置的可用内存量。
答案 5 :(得分:1)
每次我在PHP中耗尽内存时,我都会收到一条错误消息,说明这一事实。所以,我也会说,如果你的内存不足,那么脚本就不会进入print_r()
尝试在php.ini中启用auto_detect_line_endings
或使用
ini_set('auto_detect_line_endings', 1)
。可能存在窗口不理解的一些行结尾&这个ini选项可能有所帮助。有关此ini选项的更多信息,请访问here
答案 6 :(得分:1)
您应该使用count
来计算数组中的项目数,而不是print_r
。如果由于超时或其他原因导致此大型数组的输出中止,该怎么办?或print_r
中的一些错误/功能?
答案 7 :(得分:1)
PHP的print_r
函数确实有局限性。然而,即使你没有“看到”整个阵列打印,它就在那里。打印大型数据对象时,我一直在努力解决同样的问题。
它使调试变得困难,如果你必须看到整个数组,你可以创建一个循环来打印每一行。
foreach ($FileLines as $Line) echo $Line;
这应该让你看到所有的限制线。
答案 8 :(得分:0)
我会同意科里。我认为您的PHP可能配置为8MB的默认内存,其中4MB x 2已经更多。 x2的原因是因为你必须加载文件,然后创建你需要再次将文件存储在内存中的数组。我只是猜测,但这是有道理的。
你确定PHP没有记录错误吗?
答案 9 :(得分:0)
如果您输出的内容类似于Internet Explorer,您可能需要确保它可以显示您尝试放置的所有信息。我知道html页面有限制,但我不确定它是什么。