public function run() : \Jyxo\Beholder\Result
{
// The memcached or memcache extension is required
if (!extension_loaded('memcached') && !extension_loaded('memcache')) {
return new \Jyxo\Beholder\Result(\Jyxo\Beholder\Result::NOT_APPLICABLE, 'Extension memcached or memcache required');
}
$random = md5(uniqid((string) time(), true));
$key = 'beholder-' . $random;
$value = $random;
// Status label
$description = (false !== filter_var($this->host, FILTER_VALIDATE_IP) ? gethostbyaddr($this->host) : $this->host) . ':' . $this->port;
if (extension_loaded('memcached')) {
// Connection
$memcached = new \Memcached();
if (false === $memcached->addServer($this->host, $this->port)) {
return new \Jyxo\Beholder\Result(\Jyxo\Beholder\Result::FAILURE, sprintf('Connection error %s', $description));
}
} else {
// Connection (@ due to notice)
$memcached = new \Memcache();
if (false === @$memcached->connect($this->host, $this->port)) {
return new \Jyxo\Beholder\Result(\Jyxo\Beholder\Result::FAILURE, sprintf('Connection error %s', $description));
}
}
// Saving
if (false === $memcached->set($key, $value)) {
if ($memcached instanceof \Memcached) {
$memcached->quit();
} else {
$memcached->close();
}
return new \Jyxo\Beholder\Result(\Jyxo\Beholder\Result::FAILURE, sprintf('Write error %s', $description));
}
// Check
$check = $memcached->get($key);
if (false === $check || $check !== $value) {
if ($memcached instanceof \Memcached) {
$memcached->quit();
} else {
$memcached->close();
}
return new \Jyxo\Beholder\Result(\Jyxo\Beholder\Result::FAILURE, sprintf('Read error %s', $description));
}
// Deleting
if (false === $memcached->delete($key)) {
if ($memcached instanceof \Memcached) {
$memcached->quit();
} else {
$memcached->close();
}
return new \Jyxo\Beholder\Result(\Jyxo\Beholder\Result::FAILURE, sprintf('Delete error %s', $description));
}
// Disconnect
if ($memcached instanceof \Memcached) {
$memcached->quit();
} else {
$memcached->close();
}
// OK
return new \Jyxo\Beholder\Result(\Jyxo\Beholder\Result::SUCCESS, $description);
}