<?php $server = new MemcachedServer(); $server->on(Memcached::ON_CONNECT, function ($remote_ip, $remote_port) { echo "Incoming connection from {$remote_ip}:{$remote_port}" . PHP_EOL; return Memcached::RESPONSE_SUCCESS; }); $server->on(Memcached::ON_ADD, function ($client_id, $key, $value, $flags, $expiration, &$cas) { echo "client_id=[{$client_id}]: Add key=[{$key}], value=[{$value}], flags=[{$flags}], expiration=[{$expiration}]" . PHP_EOL; $cas = 15; return Memcached::RESPONSE_SUCCESS; }); $server->on(Memcached::ON_APPEND, function ($client_id, $key, $value, $cas, &$result_cas) { echo "client_id=[{$client_id}]: Append key=[{$key}], value=[{$value}], cas=[{$cas}]" . PHP_EOL; return Memcached::RESPONSE_SUCCESS; }); $server->on(Memcached::ON_PREPEND, function ($client_id, $key, $value, $cas, &$result_cas) { echo "client_id=[{$client_id}]: Prepend key=[{$key}], value=[{$value}], cas=[{$cas}]" . PHP_EOL; return Memcached::RESPONSE_SUCCESS; }); $server->on(Memcached::ON_INCREMENT, function ($client_id, $key, $delta, $initial, $expiration, &$result, &$result_cas) { echo "client_id=[{$client_id}]: Incrementing key=[{$key}], delta=[{$delta}], initial=[{$initial}], expiration=[{$expiration}]" . PHP_EOL; return Memcached::RESPONSE_SUCCESS; }); $server->on(Memcached::ON_DECREMENT, function ($client_id, $key, $delta, $initial, $expiration, &$result, &$result_cas) { echo "client_id=[{$client_id}]: Decrementing key=[{$key}], delta=[{$delta}], initial=[{$initial}], expiration=[{$expiration}]" . PHP_EOL; return Memcached::RESPONSE_SUCCESS; }); $server->on(Memcached::ON_DELETE, function ($client_id, $key, $cas) { echo "client_id=[{$client_id}]: Delete key=[{$key}], cas=[{$cas}]" . PHP_EOL; return Memcached::RESPONSE_SUCCESS;
if (!isset($this->cache[$key])) { continue; } $value = $this->cache[$key]; if ($value->expire < time()) { continue; } $rw->writeLine(sprintf('VALUE %s %d %d', $key, $value->flag, $value->length)); $rw->writeLine($value->value); } $rw->writeLine('END'); } protected function set(StreamReadWrite $rw, $key, $flag, $expire, $length) { $value = new stdClass(); $value->flag = $flag; $value->expire = time() + $expire; $value->length = $length; $value->value = $rw->readLine(); $this->cache[$key] = $value; $rw->writeLine('STORED'); } protected function delete(StreamReadWrite $rw, $key, $expire = 0) { if (isset($this->cache[$key])) { $this->cache[$key]->expire = $expire; } } } $server = new MemcachedServer(new StorageMemcacheCommand()); $server->start();
<?php $server = new MemcachedServer(); class Storage { private $values = array(); public function set($key, $value, $expiration) { $this->values[$key] = array('value' => $value, 'expires' => time() + $expiration); } public function get($key) { if (isset($this->values[$key])) { if ($this->values[$key]['expires'] < time()) { unset($this->values[$key]); return null; } return $this->values[$key]['value']; } else { return null; } } } $storage = new Storage(); $server->on(Memcached::ON_GET, function ($client_id, $key, &$value, &$flags, &$cas) use($storage) { echo "Getting key=[{$key}]" . PHP_EOL; if (($value = $storage->get($key)) != null) { return Memcached::RESPONSE_SUCCESS; } return Memcached::RESPONSE_KEY_ENOENT; });