PHP新增的memory_hard_limit_percent怎么配置?

夏强吖_1197

夏强吖_1197

2026-11-09

709人浏览

原创

memory_hard_limit_percent 是 php 8.4 引入的内存限制配置项,用于在脚本执行期间设置一个硬性的内存上限百分比。要配置它,需要在 php.ini 文件中添加或修改 memory_hard_limit_percent=75(示例值),或者通过运行时调用 ini_set('memory_hard_limit_percent', '75')。该配置指定了脚本允许使用的最大内存占系统总物理内存的比例,一旦超过此比例,php 将抛出 fatal error 并终止脚本,这与传统的 memory_limit 基于绝对字节数的限制不同,它能更好地适应不同服务器环境的动态内存分配。

PHP新增的memory_hard_limit_percent怎么配置?

如何在 php.ini 中全局启用该配置

要在服务器上全局启用 memory_hard_limit_percent,最直接的方法是编辑 php.ini 配置文件。找到 [PHP] 部分,添加指令 memory_hard_limit_percent 并赋予一个介于 0 到 100 之间的整数值。例如,设置为 50 表示脚本最多只能使用系统总内存的 50%。如果未设置该值,PHP 将回退到传统的 memory_limit 行为或无限制(取决于其他配置)。重启 Web 服务器或 PHP-FPM 服务后,配置生效。注意,该功能仅在 PHP 8.4+ 中可用,低版本会忽略此指令或报错。

; php.ini configuration
memory_hard_limit_percent = 60
memory_limit = -1 ; 可选:禁用传统字节限制,完全依赖百分比限制

上述配置中,memory_limit = -1 是为了避免传统字节限制与百分比限制冲突。如果同时设置了两者,PHP 8.4 的行为是取更严格的那个限制,但通常建议只使用 memory_hard_limit_percent 以获得更直观的内存管理。验证配置是否生效,可以创建一个简单的 PHP 脚本来检查 ini_get('memory_hard_limit_percent') 的返回值。

<?php echo ini_get('memory_hard_limit_percent'); // 输出: 60
?>

运行该脚本,如果输出为 60,说明配置成功。如果输出为空或默认值,请检查 php.ini 路径是否正确以及服务是否已重启。

如何在运行时动态调整该限制

除了全局配置,还可以在 PHP 脚本运行时动态调整 memory_hard_limit_percent。这适用于需要针对不同请求或任务设置不同内存限制的场景。使用 ini_set() 函数可以在当前脚本的执行上下文中覆盖 php.ini 中的设置。例如,在处理大数据导入时,可以临时提高限制;而在处理简单页面渲染时,可以降低限制以节省资源。

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载
<?php // 动态设置为 80%
ini_set('memory_hard_limit_percent', '80');

// 验证设置
$current_limit = ini_get('memory_hard_limit_percent');
echo "Current hard limit percent: $current_limit";

// 模拟内存消耗
$data = str_repeat('a', 1024 * 1024 * 10); // 10MB
echo "Memory used: " . memory_get_usage() . " bytes\n";
?>

在上述代码中,ini_set() 立即生效,后续的所有内存分配都将受到新设置的限制。如果脚本消耗的内存超过系统总内存的 80%,PHP 将抛出致命错误。需要注意的是,ini_set() 对 memory_hard_limit_percent 的支持依赖于 PHP 版本和 SAPI 类型。在 CLI 模式下,某些安全限制可能阻止动态更改,建议在 Web SAPI 下测试。此外,动态调整不会影响已经分配的内存块,只影响后续的内存分配决策。

当内存超过硬限制时会发生什么具体错误

当 PHP 脚本的内存使用量超过 memory_hard_limit_percent 设定的阈值时,PHP 引擎会立即中止脚本执行,并抛出一个致命的运行时错误。这个错误不是普通的 Exception,而是无法被 try-catch 块捕获的 Fatal error。错误消息通常包含类似 Allowed memory size of X bytes exhausted (tried to allocate Y bytes) 的信息,但这里 X 是基于百分比计算出的实际字节数。例如,如果系统总内存为 1GB,且 memory_hard_limit_percent 设置为 50%,则硬限制为 512MB。当脚本尝试分配内存导致总量超过 512MB 时,错误将被触发。

<?php ini_set('memory_hard_limit_percent', '10'); // 假设系统总内存为 1GB,限制为 100MB

// 尝试分配大量内存
$large_array = array_fill(0, 10000000, str_repeat('x', 100));
?>

运行上述代码,如果系统总内存为 1GB,10% 的限制即 100MB。脚本在填充数组时可能会迅速耗尽内存,最终导致如下错误:

Fatal error: Allowed memory size of 104857600 bytes exhausted (tried to allocate 100 bytes) in /path/to/script.php on line 5

这个错误表明脚本试图分配额外的 100 字节,但已达到 104857600 字节(100MB)的硬限制。开发者可以通过检查错误日志或使用自定义错误处理器(虽然无法捕获致命错误,但可以记录上下文信息)来调试此类问题。确保在生产环境中监控内存使用情况,以便及时调整 memory_hard_limit_percent 的值,避免服务中断。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

12484

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

7201

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2235

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

4528

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

5254

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

4131

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

5977

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

4682

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

12482

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
《20天入门精通PHP》视频教程
《20天入门精通PHP》视频教程

共200课时 | 49.4万人学习

墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习