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

PHP函数timeLimits重复更新afterBlock变量问题求助

解决方案

要实现仅在首次触发阻塞条件时更新afterBlock变量,只需在timeLimits()函数中添加判断逻辑,确保只有当阻塞状态未激活时才更新该变量,同时补充阻塞结束后的状态重置逻辑,避免永久阻塞。

修改后的完整代码

const TOTAL_BLOCK_TIME = 20; // 秒
const TOTAL_OPERATING_TIME_BEFORE_BLOCK = 10; // 秒

private $worker;
private $startTime;
private $afterBlock;
private $isBlocked = false;

public function __construct()
{
    $this->worker->addServer();
    $this->worker->addFunction("myfunction", array($this, "search"));
    $this->startTime = time();
    $this->afterBlock = time() - 1; // 初始化为过去时间,确保首次判断可触发更新
}

public function work()
{
   while (true) {
      $this->worker->work();
   }
}

public function timeLimits()
{
    $currentTime = time();
    $timePassed = $currentTime - $this->startTime;
    
    if ($timePassed > self::TOTAL_OPERATING_TIME_BEFORE_BLOCK) {
        // 仅当未处于阻塞状态时,才设置阻塞结束时间
        if (!$this->isBlocked) {
            $this->afterBlock = $currentTime + self::TOTAL_BLOCK_TIME;
            $this->isBlocked = true;
        }
        
        // 检查阻塞是否结束,结束则恢复正常状态
        if ($currentTime > $this->afterBlock) {
            $this->isBlocked = false;
            return false;
        }
        
        return true;
    }
    return false;
}

public function search($job)
{
    if ($this->timeLimits()) {
        return 'Blocked until:'.$this->afterBlock; 
    } 
    // 数据库查询等后续代码
    // timeLimits返回true时不会执行此处逻辑
}

关键改动说明

  1. 通过isBlocked控制更新时机:首次触发阻塞条件时,isBlocked为false,此时才会设置afterBlock并标记阻塞状态,后续调用timeLimits()时不会重复重置afterBlock。
  2. 补充阻塞结束判断:当当前时间超过afterBlock时,自动重置isBlocked为false,恢复脚本的正常执行权限,避免永久阻塞。
  3. 初始值合理性保障:afterBlock初始化为time() - 1,确保首次触发阻塞条件时能正确进入更新逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 05:35:40