0

我不知道是对还是错。我有一个 PHP 文件,内容如下:

$x = explode("\n", $y); // Making $x has length 65000
foreach ($x as $k) {
    //Some code here
}

通常我的脚本会在大约 25000 次循环后自动停止。为什么?它是PHP默认配置吗?

4

3 回答 3

3

这种行为可能是由于两个原因

  1. 脚本执行时间超过分配给它...尝试增加max_execution_timephp.ini 。

  2. 脚本的内存限制可能超过分配。为此尝试更改 memory_limitphp.ini中的值

于 2013-03-31T10:12:23.157 回答
1

PHP 的默认内存限制是 8MB(我的意思是标准发行版,而不是从源代码编译的默认 PHP,因为那是无限的)。

当我执行此代码时:

$x = array();

for ($i = 0; $i < 65000; $i++) {
    $x[$i] = $i;
}


echo (memory_get_peak_usage()/1024).'<br />';
echo (memory_get_usage()/1024).'<br />';
echo count($x);

它输出:

9421.9375
9415.875
65000

为了测试这一点,我增加了我的内存限制。但是如果你不能分配更多的内存,它会因错误而中止;

for ($i = 0; $i < 1e6; $i++) { // 1 Million
    $x[$i] = $i;
}

它报告回来;

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 32 bytes) in /Applications/MAMP/htdocs/run_app.php on line 5

供个人使用(我有 16GB RAM,所以没问题)我使用以下起始代码:

// Settings
ini_set('error_reporting', E_ALL); // Shows all feedback from the parser for debugging
ini_set('max_execution_time', 0); // Changes the 30 seconds parser exit to infinite
ini_set('memory_limit', '2048M'); // Sets the memory that may be used to 512MegaBytes

这样你就可以按照你想要的方式增加你的限制。除非您有专用服务器,否则这不适用于在线主机。如果您不知道自己在做什么,这是非常危险的。如果它开始缺乏 RAM/资源,无限循环将使您的浏览器甚至操作系统崩溃。

于 2013-03-31T10:11:37.530 回答
0

在 foreach 循环中,将数组作为引用传递。在 PHP 中,foreach 在开始循环之前制作数组的副本。因此,如果您有一个 100K 的数组,那么 foreach 将至少分配另外 100K 用于处理。通过将其作为参考传递,您只需关心地址的大小。

于 2013-03-31T10:52:00.477 回答