Очень похожие вопросы были отправлены и отвечены. Однако каждое решение, которое я нашел до сих пор, использует расширение php Memcached, а не Memcache . Я пытаюсь удалить / expire все элементы memcache, которые начинаются с предопределенного ключа. Например, so_something
, so_something_else ...
Буду признателен за любую оказанную помощь.
После некоторых исследований я решил, как это сделать, используя стандартные команды Memcache. Но, к сожалению, этот человек будет путешествовать на сервер memcache, чтобы его можно было использовать с осторожностью; в моем случае он используется только после развертывания:
/** * Helper function to expire memcache entries with a specific key prefix. * * @param string $key_prefix * The memcache key prefix. * @param array $servers * Array of used memcache servers. * @return array * */ function memcache_delete_by_key($key_prefix = '', $servers = array()) { $mc = new Memcache(); $delete_keys = array(); foreach ($servers as $server => $default) { list($host, $port) = explode(':', $server); $mc->addServer($host, $port); // Extract all the keys from Memcache. $stats = memcache_command($server, $port, "stats items"); $stat_lines = explode("\r\n", $stats); $slabs = array(); $keys = array(); foreach ($stat_lines as $line) { if (preg_match("/STAT items:([\d]+):number ([\d]+)/", $line, $matches)) { if (isset($matches[1]) && !in_array($matches[1], $slabs)) { $slabs[] = $matches[1]; $string = memcache_command($server, $port, "stats cachedump " . $matches[1] . " " . $matches[2]); preg_match_all("/ITEM (.*?) /", $string, $matches); $keys[] = $matches[1]; } } } $delete_keys = call_user_func_array('array_merge', $keys); // Locate all keys that begin with our prefix. foreach ($delete_keys as $index => $key) { // If strpos returns 0 (not false) then we have a match. if (strpos($key, $key_prefix) === 0) { $mc->delete($key); } } } return $delete_keys; } /* * Helper function to send memcache commands to a given Memcache Server */ function memcache_command($server, $port, $command) { $s = @fsockopen($server, $port); if (!$s) { return die("Cant connect to:" . $server . ":" . $port); } fwrite($s, $command . "\r\n"); $buf = ""; while ((!feof($s))) { $buf .= fgets($s, 256); // Stat says 'END'. if (strpos($buf, "END\r\n") !== FALSE) { break; } // Delete says DELETED or NOT_FOUND. if (strpos($buf, "DELETED\r\n") !== FALSE || strpos($buf, "NOT_FOUND\r\n") !== FALSE) { break; } // Flush_all says ok. if (strpos($buf, "OK\r\n") !== FALSE) { break; } } fclose($s); return ($buf); }