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时不会执行此处逻辑 }
关键改动说明
- 通过
isBlocked控制更新时机:首次触发阻塞条件时,isBlocked为false,此时才会设置afterBlock并标记阻塞状态,后续调用timeLimits()时不会重复重置afterBlock。 - 补充阻塞结束判断:当当前时间超过
afterBlock时,自动重置isBlocked为false,恢复脚本的正常执行权限,避免永久阻塞。 - 初始值合理性保障:
afterBlock初始化为time() - 1,确保首次触发阻塞条件时能正确进入更新逻辑。
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

