Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php脚本在消耗大量内存后会出现问题_Php_Memory Management - Fatal编程技术网

php脚本在消耗大量内存后会出现问题

php脚本在消耗大量内存后会出现问题,php,memory-management,Php,Memory Management,我正在浏览器中运行一个php脚本。php脚本在消耗了超过600MB的字节后运行异常。httpd使用100%的cpu。日志文件中没有出现错误。我在PHP5.4中使用xampp。为了简化问题,我测试了以下脚本: <?php set_time_limit(0); ini_set('memory_limit', '1800M'); $b=""; for($i=0;$i<630000000;$i++) { $b.='a'; } echo "completed!"; ?>

我正在浏览器中运行一个php脚本。php脚本在消耗了超过600MB的字节后运行异常。httpd使用100%的cpu。日志文件中没有出现错误。我在PHP5.4中使用xampp。为了简化问题,我测试了以下脚本:

<?php
set_time_limit(0);
ini_set('memory_limit', '1800M');
$b="";
for($i=0;$i<630000000;$i++)
{
     $b.='a';
}
echo "completed!";
?>

脚本失败,出现以下错误: 致命错误:内存不足(已分配320077824)(尝试分配319815657字节) 我的系统大约有1.5G内存可用。这怎么会发生

我的系统大约有1.5G内存可用

当然,并非所有这些都适用于PHP

您需要在PHP配置中增加:

内存限制整数
这将设置允许脚本分配的最大内存量(以字节为单位)。这有助于防止编写糟糕的脚本耗尽服务器上的所有可用内存。请注意,要没有内存限制,请将此指令设置为-1


你到底想用这段代码做什么?除了在内存中创建一个630MB的字符串(这需要至少两倍的内存,因为它是通过串联构建的)还有什么意义?最好尽量保持低内存使用率,因为在分配新内存块时会有很大的开销来检查为什么php不能从可用的物理内存分配内存php如何连接字符串?如果在C#中执行此操作,则不会扩展字符串值,而是会创建一个新字符串。所以旧值会一直挂起(占用内存),直到垃圾被回收。错误是告诉您它已经分配了
320077824
,并试图分配额外的
319815657
,这将它推到了极限;因此,内存限制设置在
320077824
320077824+319815657
之间的某个位置。。。这仍然远远低于1800MB。然而,在php.ini中更改内存限制=1500M并不能解决这个问题。有趣的是,即使我关闭浏览器,httpd仍然使用100%的CPU。我必须阻止apache使其正常。由于没有错误消息/日志,如何调试此问题?通常,如果浏览器关闭连接,脚本将中止。检查配置中的
ignore\u user\u abort
设置。