posix_getrlimit() 是 php 5.3 起内置的 posix 扩展函数,用于获取当前进程各项系统资源的软/硬限制,返回关联数组,-1 表示无限,需确保扩展启用且未被禁用。

posix_getrlimit() 在 PHP 8.2 中并不是新增函数,它早在 PHP 5.3 就已存在(随 POSIX 扩展一同引入),PHP 8.2 仅延续支持,并未改动其行为。该函数用于获取当前进程的系统资源限制(软限制和硬限制),返回一个关联数组,不需手动调用 getrlimit() 系统调用。
✅ 如何使用 posix_getrlimit()
直接调用即可,无需参数:
$limits = posix_getrlimit(); print_r($limits);
典型输出(Linux,bash 启动的 PHP 进程):
Array (
[core] => Array ( [soft] => 0 [hard] => 0 )
[data] => Array ( [soft] => -1 [hard] => -1 ) // -1 表示 RLIM_INFINITY
[fsize] => Array ( [soft] => -1 [hard] => -1 )
[stack] => Array ( [soft] => 8388608 [hard] => 8388608 ) // 8 MiB
[cpu] => Array ( [soft] => -1 [hard] => -1 )
[as] => Array ( [soft] => -1 [hard] => -1 )
[nofile] => Array ( [soft] => 1024 [hard] => 4096 )
[proc] => Array ( [soft] => 7784 [hard] => 7784 )
[memlock] => Array ( [soft] => 65536 [hard] => 65536 )
[locks] => Array ( [soft] => -1 [hard] => -1 )
[sigpending] => Array ( [soft] => 7784 [hard] => 7784 )
[msgqueue] => Array ( [soft] => 819200 [hard] => 819200 )
[nice] => Array ( [soft] => 0 [hard] => 0 )
[rtprio] => Array ( [soft] => 0 [hard] => 0 )
[rttime] => Array ( [soft] => -1 [hard] => -1 )
)
⚠️ 注意:
-1表示无限(对应RLIM_INFINITY),不是错误值。
? 常见资源键名与含义
| 键名(数组下标) | 对应常量 | 含义说明 |
|---|---|---|
core |
POSIX_RLIMIT_CORE |
core 文件最大字节数(0 表示禁用) |
stack |
POSIX_RLIMIT_STACK |
线程栈最大字节数(所有线程共享此限制) |
nofile |
POSIX_RLIMIT_NOFILE |
可打开文件描述符总数(影响 fopen、socket 等) |
data |
POSIX_RLIMIT_DATA |
数据段+堆内存上限(对 PHP 主体影响较小) |
as / vmem
|
POSIX_RLIMIT_AS |
进程虚拟地址空间总大小(关键内存上限) |
proc |
POSIX_RLIMIT_NPROC |
每用户可创建的最大子进程/线程数 |
? 使用前提与限制
-
POSIX 扩展必须启用:确认
php.ini中未禁用posix,且未在disable_functions中列出posix_getrlimit; ✅ 正确(默认通常开启) extension=posix ; ❌ 若有以下行,需移除或注释掉 disable_functions = ..., posix_getrlimit, ...
无特权进程只能读取自身限制:不能读取其他进程,也不需要 root 权限。
-
返回值始终为数组:失败时不会返回
false,而是触发E_WARNING并返回空数组或部分缺失项(取决于内核支持程度)。建议检查是否为空:$limits = posix_getrlimit(); if (empty($limits) || !isset($limits['stack'])) { error_log("Failed to retrieve resource limits"); }
? 实用小技巧
-
判断是否允许生成 core 文件:
$core = posix_getrlimit()['core'] ?? ['soft' => 0]; if ($core['soft'] > 0) { echo "Core dumps enabled (max $core[soft] bytes)"; } else { echo "Core dumps disabled"; } -
检查文件描述符是否吃紧(如长连接服务):
$nofile = posix_getrlimit()['nofile'] ?? ['soft' => 1024]; echo "Current soft nofile limit: {$nofile['soft']}\n"; ulimit -s或ulimit -n的值会直接影响这里的结果 —— 它们就是 shell 层面对应的setrlimit()设置。
不复杂但容易忽略:这个函数返回的是当前进程启动时继承的限制,不是实时占用量,也不能反映子进程或线程的独立配置。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











