You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP是否暴露内部超时时钟?如何获取剩余可用CPU时间?

获取PHP脚本已用CPU时间及剩余可用执行时间

一、获取已用CPU时间:使用getrusage()

PHP没有直接暴露内部跟踪的CPU计时,但可以通过系统级的getrusage()函数获取进程的资源使用情况,其中包含用户态和内核态的CPU耗时,两者相加就是总CPU时间。

代码示例

$rusage = getrusage();

// 计算用户态CPU耗时(秒,包含微秒部分)
$userCpuTime = $rusage['ru_utime.tv_sec'] + $rusage['ru_utime.tv_usec'] / 1000000;
// 计算内核态CPU耗时
$systemCpuTime = $rusage['ru_stime.tv_sec'] + $rusage['ru_stime.tv_usec'] / 1000000;
// 总CPU耗时
$totalCpuTime = $userCpuTime + $systemCpuTime;

echo "已用CPU时间:{$totalCpuTime} 秒";

兼容性说明

  • 该函数在Linux/Unix系统下能准确获取数据,是最可靠的方案。
  • Windows系统下getrusage()的实现有限,部分字段可能返回0,无法准确统计CPU时间。

二、计算剩余可用执行时间

结合getrusage()获取的已用CPU时间,以及当前的max_execution_time限制(即set_time_limit()设置的值或php.ini默认值),可以计算剩余可用的CPU时间。

实现函数

function getRemainingCpuTime(): float {
    $maxExecutionTime = (int)ini_get('max_execution_time');
    
    // 0表示无时间限制
    if ($maxExecutionTime === 0) {
        return INF;
    }

    $rusage = getrusage();
    $userCpu = $rusage['ru_utime.tv_sec'] + $rusage['ru_utime.tv_usec'] / 1000000;
    $systemCpu = $rusage['ru_stime.tv_sec'] + $rusage['ru_stime.tv_usec'] / 1000000;
    $totalUsedCpu = $userCpu + $systemCpu;

    // 确保剩余时间不小于0
    return max(0.0, $maxExecutionTime - $totalUsedCpu);
}

// 使用示例
echo "剩余可用CPU时间:" . number_format(getRemainingCpuTime(), 2) . " 秒";

注意事项

  • 每次调用set_time_limit()后,max_execution_time会被重置,函数会自动获取最新的限制值。
  • PHP内部的执行时间跟踪与getrusage()的统计可能存在微小误差,但足以满足绝大多数场景需求。

三、Windows环境下的替代方案

如果运行在Windows系统,getrusage()无法准确工作,可以用microtime(true)记录墙钟时间作为近似,但该方法会包含sleep()、网络等待等非CPU耗时,仅适用于CPU密集型脚本。

代码示例

// 脚本开头记录启动时间
$startWallTime = microtime(true);

// 执行业务代码...

// 计算已用墙钟时间
$elapsedWallTime = microtime(true) - $startWallTime;
$maxExecutionTime = (int)ini_get('max_execution_time');
$remainingTime = $maxExecutionTime > 0 ? max(0, $maxExecutionTime - $elapsedWallTime) : INF;

echo "近似剩余时间:" . number_format($remainingTime, 2) . " 秒";

内容的提问来源于stack exchange,提问作者afiori

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:38:14