php脚本在消耗大量内存后会出现问题
我正在浏览器中运行一个php脚本。php脚本在消耗了超过600MB的字节后运行异常。httpd使用100%的cpu。日志文件中没有出现错误。我在PHP5.4中使用xampp。为了简化问题,我测试了以下脚本: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
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
设置。