当达到内存限制时,PHP未触发致命错误

当达到内存限制时,PHP未触发致命错误,php,out-of-memory,Php,Out Of Memory,我有一个基本页面,在那里我试图有致命错误,内存不足消息显示,但是什么都没有发生脚本工作没有错误,PHP7.1.9没有suhosin ini_set("memory_limit", 100); //100 bytes. echo "Memory Limit Bytes " . ini_get("memory_limit") . PHP_EOL; echo "Script peak memory usage " . memory_get_peak_usage() . PHP_EOL; 输出没有致命

我有一个基本页面,在那里我试图有
致命错误,内存不足
消息显示,但是什么都没有发生脚本工作没有错误,PHP7.1.9没有suhosin

ini_set("memory_limit", 100); //100 bytes.
echo "Memory Limit Bytes " . ini_get("memory_limit") . PHP_EOL;
echo "Script peak memory usage " . memory_get_peak_usage() . PHP_EOL;
输出没有致命错误

Memory Limit Bytes 100
Script peak memory usage 386960
The End

您正在进入一个非常麻烦的PHP领域。问题是,一旦PHP进程内存耗尽,游戏就结束了。不会引发异常,因为致命错误会触发脚本终止

根据我的经验,这里最好的方法是使用register_shutdown_function()注册一个回调,该回调将检查error_get_last(),并处理由@(shutup)操作符或ini_set(“display_errors”,false)禁用的违规代码

如果发生此错误时需要执行重要的清理代码,那么注册关闭函数是不够的。一种方法是在PHP进程发生意外时,在可以释放的地方分配一些紧急内存

<?php 
ini_set("memory_limit", 400000); //100 bytes
ini_set('display_errors', false);
error_reporting(-1);

echo("start");
echo "Memory Limit Bytes " . ini_get("memory_limit") . PHP_EOL;
echo "Script peak memory usage " . memory_get_peak_usage() . PHP_EOL;

// This storage is freed on error (case of allowed memory exhausted)
$memory = str_repeat('*', 100000);
echo("2");
set_error_handler(function($code, $string, $file, $line){
        throw new ErrorException($string, null, $code, $file, $line);
    });

register_shutdown_function(function(){
    global $memory;
    $memory = null;
    $error = error_get_last();
    if(null !== $error)
    {
        echo 'Caught at shutdown';
    }
});

try
{
    $a = '';
    for ($i=0; $i<=10000000; $i++) {
        $a .= '1';
    }
    echo("done");
}
catch(\Exception $exception)
{
    echo 'Caught in try/catch';
}
?>


查看这篇讨论PHP内存处理(以及其他内容)的文章。

尝试在页面顶部添加一个:ini_set(“内存限制”,128M);