note 85423 added to function.shmop-open

From: Date: Fri, 29 Aug 2008 10:24:05 +0000
Subject: note 85423 added to function.shmop-open
Groups: php.notes 
Request: Send a blank email to php-notes+get-143977@lists.php.net to get a copy of this message
If you faced with any problem you're going to solve with shared memmory, but your server doesn't support it, you can use files instead. I've wrote simple wrapper for this and its suites for me. Hope it will be usefull for you too. <?php define(kSHARED_FOLDER, "shared/"); define(kSHARED_MAX_ATTEMPS, 10); define(kSESSION_SHARED, "shared_"); class Shared { var $id = 0; var $filename = ''; var $filepointer; var $data = array(); var $date = 0; function Shared($id) { $this->id = $id; $this->filename = kSHARED_FOLDER.$this->id; if(empty($this->filename)) { print "no filename"; return false; } $this->date = $_SESSION[kSESSION_SHARED.$id]; } function clear() { if ($this->id == null) { return false; } $counter = 0; ignore_user_abort(true); if(($this->filepointer = @fopen($this->filename, "w")) == false) { ignore_user_abort(false); return false; } while(true) { if ($counter >= kSHARED_MAX_ATTEMPS) { fclose($this->filepointer); ignore_user_abort(false); return false; } if(flock($this->filepointer, LOCK_EX) == false) { $counter++; usleep(rand(1, 25000)); } else break; } if(flock($this->filepointer, LOCK_UN) == false) { ignore_user_abort(false); return false; } unset($this->data); $this->data = array(); fclose($this->filepointer); $this->date = $_SESSION[kSESSION_SHARED.$id] = filemtime($this->filename); ignore_user_abort(false); return true; } function setObjectForKey($value, $key) { if ($this->id == null) return false; $counter = 0; ignore_user_abort(true); if(($this->filepointer = @fopen($this->filename, "a+")) == false) { ignore_user_abort(false); print "can not open file<br>"; return false; } while(true) { if ($counter >= kSHARED_MAX_ATTEMPS) { fclose($this->filepointer); print("1 aborted..."); ignore_user_abort(false); return false; } $block; if(flock($this->filepointer, LOCK_EX, $block) == false) { $counter++; print("1 waiting..."); usleep(rand(1, 25000)); } else break; } $data = file_get_contents($this->filename); $array = array(); if (!empty($data)) $array = unserialize($data); $array[$key] = $value; $data = serialize($array); ftruncate($this->filepointer, 0); fseek($this->filepointer, 0, SEEK_SET); fwrite($this->filepointer, $data); $this->data = $array; if(flock($this->filepointer, LOCK_UN) == false) { ignore_user_abort(false); return false; } fclose($this->filepointer); $this->date = $_SESSION[kSESSION_SHARED.$id] = filemtime($this->filename); ignore_user_abort(false); return true; } function getObjectForKey($key) { if ($this->id == null) return null; $counter = 0; ignore_user_abort(true); if(($this->filepointer = @fopen($this->filename, "a+")) == false) { ignore_user_abort(false); print("can not open<br>"); return null; } if ($this->date == filemtime($this->filename)) { fclose($this->filepointer); return $this->data[$key]; } while(true) { if ($counter >= kSHARED_MAX_ATTEMPS) { fclose($this->filepointer); ignore_user_abort(false); print("2 aborted<br>"); return null; } if(flock($this->filepointer, LOCK_SH ) == false) { $counter++; print("2 waiting...<br>"); usleep(rand(1, 25000)); } else break; } fseek($this->filepointer, 0); $data = file_get_contents($this->filename); $array = array(); if (!empty($data)) $array = unserialize($data); $data = $array[$key]; $this->data = $array; if(flock($this->filepointer, LOCK_UN) == false) { ignore_user_abort(false); return $data; } fclose($this->filepointer); $this->date = $_SESSION[kSESSION_SHARED.$id] = filemtime($this->filename); ignore_user_abort(false); return $data; } } ?> ---- Server IP: 69.147.83.197 Probable Submitter: 217.147.104.41 (proxied: 175.37.12.102) ---- Manual Page -- http://www.php.net/manual/en/function.shmop-open.php Edit -- https://master.php.net/note/edit/85423 Del: integrated -- https://master.php.net/note/delete/85423/integrated Del: useless -- https://master.php.net/note/delete/85423/useless Del: bad code -- https://master.php.net/note/delete/85423/bad+code Del: spam -- https://master.php.net/note/delete/85423/spam Del: non-english -- https://master.php.net/note/delete/85423/non-english Del: in docs -- https://master.php.net/note/delete/85423/in+docs Del: other reasons-- https://master.php.net/note/delete/85423 Reject -- https://master.php.net/note/reject/85423 Search -- https://master.php.net/manage/user-notes.php

« previous php.notes (#143977) next »