我不知道是对还是错。我有一个 PHP 文件,内容如下:
$x = explode("\n", $y); // Making $x has length 65000
foreach ($x as $k) {
//Some code here
}
通常我的脚本会在大约 25000 次循环后自动停止。为什么?它是PHP默认配置吗?
这种行为可能是由于两个原因
脚本执行时间超过分配给它...尝试增加max_execution_time
php.ini 。
脚本的内存限制可能超过分配。为此尝试更改
memory_limit
php.ini中的值
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/资源,无限循环将使您的浏览器甚至操作系统崩溃。
在 foreach 循环中,将数组作为引用传递。在 PHP 中,foreach 在开始循环之前制作数组的副本。因此,如果您有一个 100K 的数组,那么 foreach 将至少分配另外 100K 用于处理。通过将其作为参考传递,您只需关心地址的大小。