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