note 85423 deleted from function.shmop-open by cmb

From: Date: Wed, 13 May 2020 09:15:34 +0000
Subject: note 85423 deleted from function.shmop-open by cmb
References: 1  Groups: php.notes 
Request: Send a blank email to php-notes+get-214621@lists.php.net to get a copy of this message
Note Submitter: DinosauRUS ---- 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; } } ?>

« previous php.notes (#214621) next »