$id, 'time' => time()); store_value(HASHID,$temp); sem_release($shmid); } function &hash($hash_string){ $hash =& fmod(hexdec(md5($hash_string)), HASH_PRIME); //log_this("Hashing " . $hash_string . " to " . $hash . "\n"); return $hash; } function cache_end($contents){ if(trim($contents)){ $datasize = strlen($contents); $hash_string = "http://".$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"].serialize($_POST); $shmid = store_value($hash_string,$contents); update_keys($hash_string,$shmid); } return $contents; //display } function delete_key($key){ $SHM_KEY = ftok(LOCK, 'R'); $shmid = @sem_get($SHM_KEY, 1024, 0644 | IPC_CREAT); sem_acquire($shmid); $data = get_value(HASHID); if(isset($data[$key])){ $v = $data[$key]; $id = mem_exist($v['shmid']); delete_mem($id); close_mem($id); unset($data[$key]); store_value(HASHID, $data); } sem_release($shmid); } function clear_cache(){ $SHM_KEY = ftok(LOCK, 'R'); $shmid = @sem_get($SHM_KEY, 1024, 0644 | IPC_CREAT); sem_acquire($shmid); $data = get_value(HASHID); print_r($data); foreach ($data as $k => $v){ $id = mem_exist($v['shmid']); delete_mem($id); close_mem($id); } $data = array(); store_value(HASHID, $data); sem_release($shmid); } function garbage_collection(){ $SHM_KEY = ftok(LOCK, 'R'); $shmid = @sem_get($SHM_KEY, 1024, 0644 | IPC_CREAT); sem_acquire($shmid); $data = get_value(HASHID); foreach ($data as $k => $v){ if(time() - $v['time'] > CACHE_SECONDS){ //log_this("garbage collection found expired key $k, value $v[shmid] in hash table... deleting\n"); $id = mem_exist($v['shmid']); delete_mem($id); close_mem($id); unset($data[$k]); } store_value(HASHID, $data); } sem_release($shmid); } function do_cache(){ $key = "http://".$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"].serialize($_POST); $contents =& get_value($key); if($contents){ //log_this("Cache hit for " . $key . "\n"); print $contents; exit; } garbage_collection(); ob_start("cache_end"); // callback } ?>