public function onError(ResourceEvent $event) { $key = $event->getParam('key'); $keys = []; $file = $this->getFile(); if (file_exists($file)) { $keys = json_decode(file_get_contents($file), true) ?: $keys; } $keys[] = $key; $keys = array_unique($keys); file_put_contents($file, json_encode($keys), LOCK_EX); }
/** * @param array $keys * @return Adapter\AbstractResourceAdapter */ protected function resourceLoopConnect(array $keys) { $resource = null; $event = new ResourceEvent(); $event->setTarget($this); $event->setParam('keys', $keys); $event->setName(ResourceEvent::EVENT_CONNECTION_PRE); $results = $this->getEventManager()->triggerEvent($event); if (is_array($results->last())) { $keys = array_diff($keys, $results->last()); } foreach ($keys as $key) { $event->setParam('key', $key); $event->setParam('resource', $this->getResource($key)); try { $resource = $this->getResource($key)->connect(); $event->setName(ResourceEvent::EVENT_CONNECTION_SUCCESS); $this->getEventManager()->triggerEvent($event); break; } catch (ConnectionException $e) { $event->setParam('exception', $e); $event->setName(ResourceEvent::EVENT_CONNECTION_ERROR); $results = $this->getEventManager()->triggerEvent($event); $last = $results->last(); if ($last instanceof ResourceInterface) { $resource = $last->connect(); break; } } } if (!$resource) { throw new \RuntimeException('All server is broken.', 0, $event->getParam('exception')); } return $resource; }