187 lines
3.8 KiB
PHP
187 lines
3.8 KiB
PHP
<?php
|
|
|
|
/** Loading and saving data, it's only cache so load() does not need to block until save()
|
|
*/
|
|
interface NotORM_Cache {
|
|
|
|
/** Load stored data
|
|
* @param string
|
|
* @return mixed or null if not found
|
|
*/
|
|
function load($key);
|
|
|
|
/** Save data
|
|
* @param string
|
|
* @param mixed
|
|
* @return null
|
|
*/
|
|
function save($key, $data);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Cache using $_SESSION["NotORM"]
|
|
*/
|
|
class NotORM_Cache_Session implements NotORM_Cache {
|
|
|
|
function load($key) {
|
|
if (!isset($_SESSION["NotORM"][$key])) {
|
|
return null;
|
|
}
|
|
return $_SESSION["NotORM"][$key];
|
|
}
|
|
|
|
function save($key, $data) {
|
|
$_SESSION["NotORM"][$key] = $data;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Cache using file
|
|
*/
|
|
class NotORM_Cache_File implements NotORM_Cache {
|
|
private $filename, $data = array();
|
|
|
|
function __construct($filename) {
|
|
$this->filename = $filename;
|
|
$this->data = unserialize(@file_get_contents($filename)); // @ - file may not exist
|
|
}
|
|
|
|
function load($key) {
|
|
if (!isset($this->data[$key])) {
|
|
return null;
|
|
}
|
|
return $this->data[$key];
|
|
}
|
|
|
|
function save($key, $data) {
|
|
if (!isset($this->data[$key]) || $this->data[$key] !== $data) {
|
|
$this->data[$key] = $data;
|
|
file_put_contents($this->filename, serialize($this->data), LOCK_EX);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Cache using PHP include
|
|
*/
|
|
class NotORM_Cache_Include implements NotORM_Cache {
|
|
private $filename, $data = array();
|
|
|
|
function __construct($filename) {
|
|
$this->filename = $filename;
|
|
$this->data = @include realpath($filename); // @ - file may not exist, realpath() to not include from include_path //! silently falls with syntax error and fails with unreadable file
|
|
if (!is_array($this->data)) { // empty file returns 1
|
|
$this->data = array();
|
|
}
|
|
}
|
|
|
|
function load($key) {
|
|
if (!isset($this->data[$key])) {
|
|
return null;
|
|
}
|
|
return $this->data[$key];
|
|
}
|
|
|
|
function save($key, $data) {
|
|
if (!isset($this->data[$key]) || $this->data[$key] !== $data) {
|
|
$this->data[$key] = $data;
|
|
file_put_contents($this->filename, '<?php return ' . var_export($this->data, true) . ';', LOCK_EX);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Cache storing data to the "notorm" table in database
|
|
*/
|
|
class NotORM_Cache_Database implements NotORM_Cache {
|
|
private $connection;
|
|
|
|
function __construct(PDO $connection) {
|
|
$this->connection = $connection;
|
|
}
|
|
|
|
function load($key) {
|
|
$result = $this->connection->prepare("SELECT data FROM notorm WHERE id = ?");
|
|
$result->execute(array($key));
|
|
$return = $result->fetchColumn();
|
|
if (!$return) {
|
|
return null;
|
|
}
|
|
return unserialize($return);
|
|
}
|
|
|
|
function save($key, $data) {
|
|
// REPLACE is not supported by PostgreSQL and MS SQL
|
|
$parameters = array(serialize($data), $key);
|
|
$result = $this->connection->prepare("UPDATE notorm SET data = ? WHERE id = ?");
|
|
$result->execute($parameters);
|
|
if (!$result->rowCount()) {
|
|
$result = $this->connection->prepare("INSERT INTO notorm (data, id) VALUES (?, ?)");
|
|
try {
|
|
@$result->execute($parameters); // @ - ignore duplicate key error
|
|
} catch (PDOException $e) {
|
|
if ($e->getCode() != "23000") { // "23000" - duplicate key
|
|
throw $e;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// eAccelerator - user cache is obsoleted
|
|
|
|
|
|
|
|
/** Cache using "NotORM." prefix in Memcache
|
|
*/
|
|
class NotORM_Cache_Memcache implements NotORM_Cache {
|
|
private $memcache;
|
|
|
|
function __construct(Memcache $memcache) {
|
|
$this->memcache = $memcache;
|
|
}
|
|
|
|
function load($key) {
|
|
$return = $this->memcache->get("NotORM.$key");
|
|
if ($return === false) {
|
|
return null;
|
|
}
|
|
return $return;
|
|
}
|
|
|
|
function save($key, $data) {
|
|
$this->memcache->set("NotORM.$key", $data);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Cache using "NotORM." prefix in APC
|
|
*/
|
|
class NotORM_Cache_APC implements NotORM_Cache {
|
|
|
|
function load($key) {
|
|
$return = apc_fetch("NotORM.$key", $success);
|
|
if (!$success) {
|
|
return null;
|
|
}
|
|
return $return;
|
|
}
|
|
|
|
function save($key, $data) {
|
|
apc_store("NotORM.$key", $data);
|
|
}
|
|
|
|
}
|