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

如何在PHP中自动定期执行心跳检测,无需扩展?

无需扩展的PHP心跳自动执行方案

以下几种方案可以避免手动添加心跳调用,且不需要依赖uopz这类扩展:

1. 纯PHP定时轮询(适用于长期运行的CLI脚本)

如果你的脚本是守护进程类的长期运行程序,可以在主业务循环中加入时间差检查,自动触发心跳:

$heartbeatService = new HeartbeatService();
$lastHeartbeatTime = 0;

// 主业务循环
while (true) {
    // 执行核心业务逻辑
    runBusinessLogic();

    // 每10秒触发一次心跳
    $currentTime = time();
    if ($currentTime - $lastHeartbeatTime >= 10) {
        $heartbeatService->updateTimestamp();
        $lastHeartbeatTime = $currentTime;
    }

    // 短暂休眠降低CPU占用
    usleep(100000); // 休眠0.1秒
}

优势:无需任何扩展,逻辑简单直接;局限:依赖主循环的执行频率,如果单次业务逻辑执行超过10秒,心跳会延迟。

2. 框架生命周期钩子(适用于Web框架项目)

如果你的代码基于Laravel、Symfony等Web框架,可以利用框架的全局中间件或内核事件,在请求处理流程中自动触发心跳检查:

以Laravel全局中间件为例:

<?php

namespace App\Http\Middleware;

use Closure;
use App\Services\HeartbeatService;

class AutoHeartbeat
{
    protected $heartbeat;

    public function __construct(HeartbeatService $heartbeat)
    {
        $this->heartbeat = $heartbeat;
    }

    public function handle($request, Closure $next)
    {
        // 检查心跳间隔,满足条件则更新
        if (time() - $this->heartbeat->getLastHeartbeatTime() >= 10) {
            $this->heartbeat->updateTimestamp();
        }

        return $next($request);
    }
}

将该中间件注册到全局中间件组后,每个请求都会自动触发心跳检查。

优势:无侵入业务代码,适配Web请求场景;局限:如果10秒内没有请求进入,心跳会中断。

3. 纯PHP实现AOP代理(无侵入业务代码)

通过动态代理类包裹业务对象,在调用业务方法前自动执行心跳检查,无需修改原有业务代码:

<?php

class HeartbeatProxy
{
    protected $target;
    protected $heartbeat;
    protected $lastTrigger = 0;

    public function __construct($target, HeartbeatService $heartbeat)
    {
        $this->target = $target;
        $this->heartbeat = $heartbeat;
    }

    public function __call($method, $args)
    {
        // 触发心跳检查
        $now = time();
        if ($now - $this->lastTrigger >= 10) {
            $this->heartbeat->updateTimestamp();
            $this->lastTrigger = $now;
        }

        // 调用原业务方法
        return call_user_func_array([$this->target, $method], $args);
    }
}

// 使用方式:用代理类包裹业务对象
$businessService = new HeartbeatProxy(new YourBusinessService(), new HeartbeatService());
$businessService->doYourBusiness();

优势:完全不修改业务代码,统一管理心跳逻辑;局限:需要通过代理类实例化所有需要触发心跳的业务对象,适合有统一实例化入口的项目。

4. 独立定时任务(适用于所有场景)

在Linux环境下,用cron或systemd定时任务单独执行心跳脚本,完全脱离业务代码:

  1. 编写独立的心跳脚本heartbeat.php:
<?php
require __DIR__ . '/vendor/autoload.php';

$heartbeatService = new HeartbeatService();
$heartbeatService->updateTimestamp();
  1. 添加crontab定时任务:
*/10 * * * * php /path/to/your/heartbeat.php

优势:完全不依赖业务脚本,实现简单;局限:无法感知业务脚本是否存活,若业务脚本已退出,心跳仍会继续执行,需额外添加进程存活检查逻辑。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 00:18:31