在 PHP 中,数组的最大键数量是多少?

11

我正在编写一个调用

mysqli_query()

函数的PHP脚本。

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

将文件拆分成一个数组。该文件有超过100,000行,应该有100,000个元素在数组中,但运行时出现了问题。

print_r($lines);
exit;

这个数组只包含7280个元素。

所以我很好奇,究竟是怎么回事?一个数组所能拥有的键值数量是否存在限制?我的本地环境是双核2.0GHz处理器,2GB内存(虽然运行的是Vista和IIS);因此,我有点困惑为什么一个4MB的文件会出现这样的结果。

编辑: 我之前在php.ini中已将memory_limit设置为512MB。


如果您使用count检查数组中的元素数量,它是否也只报告7280? - Cory
(相关)哈希表 - Gordon
10个回答

5

达瑞尔·海因,

是的,错误日志中没有任何内容。我甚至增加了错误报告,但与print_r()无关的内容仍然没有出现。

回应杰伊: 我运行了

echo count($lines);

我得到了105,546的结果,但print_r()只显示了7280。根据Rob Walker的建议,我循环遍历了数组中的所有元素,它实际上包含了所有的结果。这让我相信问题出在print_r()本身而不是数组大小限制。
另一个奇怪的事情是,我在我的REHL服务器上尝试了一下,结果正常。现在我不想把这归咎于Windows/IIS,但事实就是这样。
基于上述考虑,我认为这个问题应该重新命名,因为它与数组无关,而是与print_r有关。

这是非常有用的知识,也许你可以将其作为社区拥有的答案,以便您可以接受它。 - paan
在http://au.php.net/print_r上,有几个可以正确工作的print_r替代品(假设这是print_r的限制)。 - dbr

4

编辑:正如Rob所说,如果您的应用程序内存不足,很可能甚至无法到达print_r行。这也是我的猜测,但如果确实是内存问题,则以下内容可能会有所帮助。

查看php.ini文件中的此行,并将其增加到16或更多。

memory_limit = 8M

如果您没有访问php.ini的权限(例如在共享服务器上发生此情况),您可以使用像这样的.htaccess文件解决问题。该文件内容如下:
php_value memory_limit 16M

然而,有些主机不允许您这样做。


2

print_r的输出是否存在固有限制呢?我建议检查文件的第一行和最后一行,看看它们是否在数组中。如果你在向数组插入数据时达到了内存极限,那么你将永远无法执行print_r操作。


2
两个建议:
  1. 计算数组中实际的项数,看看数组是否具有正确的条目数(从而排除或确定 print_r() 是否是罪魁祸首)。

  2. 验证输入... 文件中的换行符是否可能会导致问题?例如,是否存在不同类型的换行符混合使用的情况?请参见函数file()的手册页面以及有关auto_detect_line_endings设置的说明,尽管这与Mac换行符无关。


1

PHP的print_r函数确实有限制。但是,即使您没有“看到”整个数组被打印出来,它仍然存在。当我打印大型数据对象时,我也曾遇到过这个问题。

如果您必须看到整个数组,则可以创建一个循环以打印每一行,否则会使调试变得困难。

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

这样就可以让您无限制地查看所有行。


1

我相信这取决于在php.ini文件中设置的可用内存量。


如果文件超过了内存限制,你难道不会期望出现异常或其他情况吗? - Greg Hewgill
不完全是。解释器会清理它所能清理的内容,并停止任何额外的操作; 除此之外,它可能会记录发生的情况。 - Robert K

1
每次我在PHP中用尽内存时,都会收到一个说明这一事实的错误消息。因此,我还要说,如果你的内存不足,那么脚本就无法到达print_r()
尝试在php.ini中启用auto_detect_line_endings或使用ini_set('auto_detect_line_endings', 1)。可能有一些行结尾符号是Windows无法理解的,而这个ini选项可以帮助解决问题。关于这个ini选项的更多信息可以在这里找到。

1

在数组中计算项目数量时,应该使用count而不是print_r如果由于超时或其他原因而中止了此大型数组的输出,或者print_r中存在某些错误/特性,那该怎么办呢?


0
我同意Cory的观点。我认为你的PHP可能配置了默认的8MB内存,而4MB x 2已经足够了。x2的原因是因为你需要加载文件,然后再次将文件加载到内存中创建数组。我只是猜测,但这很有道理。
你确定PHP没有记录错误吗?

0
如果你要输出到像Internet Explorer这样的东西,你可能想确保它能够显示你尝试放置在那里的所有信息。我知道html页面有限制,但我不确定是什么。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接