public function getItem($key, &$success = null, $queue = true) { //check to see if it's already been cached in the class $value = parent::getItem($key, $success, $queue); if ($success === true) { return $value; } else { $fileName = $this->getFileName($key); if ($queue === true && !file_exists($fileName)) { if ($this->isQueueInProgress($fileName) === true) { //anonymous function to test if we should continue to wait $condition = function () use($fileName) { return !file_exists($fileName); }; $wait = $this->wait($condition); if ($wait === false) { $this->clearQueue($key); $success = false; return null; } else { $success = true; return $this->readFromFile($fileName); } } else { $this->queue($fileName); $success = false; return null; } } else { $ttl = $this->getTtl($key); if ($ttl < time() && $this->isReCacheInProgress($fileName) === false) { //set the queue $this->reCache($fileName); $success = false; return null; } else { $success = true; $value = $this->readFromFile($fileName); return $value; } } } }