Version: 0.9
Type: Class
Category: Other
License: GNU General Public License
Description: Application type variable, like M$ ASP application variable
<?
/*
2001-03-01 - Fredrik (fln@mendosus.org)
Create ASP application type variables
(compile with --enable-shmop )
M4ApplicationsVariable version 0.9
Lots of bugs, isnt very good...
do not fixes its own mess...
TODO:
Enable dynamic size of keysTable, and keys
debug true: output lots of debugging data
usage
//set .php
include "class.M4App.php";
$app = new M4ApplicationsVariable(false);
$app->set("foo", "hey was up?");
//
//get.php
include "class.M4App.php";
$app = new M4ApplicationsVariable();
echo $app->get("foo");
//
class M4ApplicationsVariable
{
var $keysTable = array(); //table containing all keys
var $keysID = array(); //table containing key systemid
var $keysSize = 100; //size of index table
var $keySize = 100; //size of each key
var $keysSysID = 4095; //system id of key (0xfff)
var $keyHandle = false; //system handle for key
var $debug = false;
function M4ApplicationsVariable($debug_ = false)
{
$this->debug = $debug_;
$this->readKeys();
}
function readKeys()
{
$this->keyHandle = @shmop_open($this->keysSysID, "a", 0644, $this->keysSize);
if (!$this->keyHandle)
{
return false;
echo "<pre>error[M4ApplicationsVariable]: unable to open allocated memory</pre>";
exit;
}
//$tmp = shmop_size($this->keys);
$ptr = shmop_read($this->keyHandle, 0, $this->keysSize);
$ptr = substr($ptr, 0, strpos($ptr, "|") );
if ($this->debug == true)
echo "data(readkeys) (in): " . $ptr . "<br>";
$ptr = trim($ptr);
$t = split(",", $ptr);
$tc = count($t);
$this->keysTable = array();
for ($i = 0; $i < $tc;$i++)
{
$tkey = split("=", $t[$i] );
$this->keysTable[ $tkey[0] ] = $tkey[1];
}
$this->close($this->keyHandle);
return $ptr;
}
function writeKeys($instr)
{
if ($this->debug == true)
{
echo "*writeKeys*";
echo "handle:" . $this->keyHandle . "<br>";
echo "sys:" . $this->keysSysID . "<br>";
}
$this->keyHandle = shmop_open($this->keysSysID, "c", 0644, $this->keysSize);
if (!$this->keyHandle)
{
echo "<pre>error[M4ApplicationsVariable]: unable to allocate memory</pre>";
exit;
}
$instr = str_replace ("|", "", $instr) . "|";
$result = shmop_write($this->keyHandle, $instr, 0);
if ($result == 0 && $instr == "")
{
if ($this->debug == true)
echo "killing self";
$this->destroySelf();
}
if ($this->debug == true)
{
echo "Bytes written:" . $result . "<br>";
echo "Data (out):" . $instr . "<br><br>";
}
if($result != strlen($instr))
{
echo "<pre>error[M4ApplicationsVariable.writeKeys]: unable to write to allocated memory</pre>";
exit;
}
$this->close($this->keyHandle);
}
function addKey($key)
{
if ($this->debug == true)
echo "*addkey*";
$ptr = $this->readKeys();
if ($this->debug == true)
{
echo "Ant: " . count($this->keysTable) . "<br>";
echo "Current data: " . $ptr . "<br>";
}
$addr = (int) ( (int) $this->keysSysID + (int) count($this->keysTable) +1 );
$ptr .= ((count($this->keysTable) == 0) ? "" : ",") . $key . "=" . $addr;
$this->keysTable[ $key ] = $addr;
if ($this->debug == true)
{
echo "New data: " . $ptr . "<br>";
}
$this->writeKeys($ptr);
}
function showKeys()
{
while ( list ($key,$value) = each ($this->keysTable) )
{
// if (!(empty($key)))
{
printf("key: %s [%x]<br>", $key, $value);
}
}
}
function set($key, $value)
{
if ($this->debug == true)
echo "*set*";
if (! isset($this->keysTable[ $key ] )) //key dont exisist
{
$this->addKey($key);
}
if ($this->debug == true)
echo "segment (set): " . $this->keysTable[$key] . "<br>";
$id = shmop_open($this->keysTable[$key], "c", 0644, $this->keysSize);
if (!$id)
{
echo "<pre>error[M4ApplicationsVariable.set]: unable to allocate memory</pre>";
exit;
}
$value .= "|";
$result = shmop_write($id, $value, 0);
if ($this->debug == true)
{
echo "Bytes written (set):" . $result . "<br>";
echo "Data (out)(set): " . $value . "<br>";
}
if($result != strlen($value))
{
echo "<pre>error[M4ApplicationsVariable.set: unable to write to allocated memory</pre>";
exit;
}
$this->close($id);
}
function get($key)
{
if (! isset($this->keysTable[ $key ] )) //key dont exisist
{
return false;
echo "<pre>error[M4ApplicationsVariable.get]: nu such key</pre>";
exit;
}
if ($this->debug == true)
echo "segment: " . $this->keysTable[$key] . "<br>";
$id = @shmop_open($this->keysTable[$key], "a", 0644, $this->keysSize);
if (!$id)
{
echo "<pre>error[M4ApplicationsVariable.set]: unable to open allocated memory</pre>";
exit;
}
$ptr = shmop_read($id, 0, $this->keysSize);
$ptr = substr($ptr, 0, strpos($ptr, "|") );
if ($this->debug == true)
echo "data (in): " . $ptr . "<br>";
$ptr = trim($ptr);
$this->close($id);
return $ptr;
}
function kill($key)
{
if ($this->debug == true)
echo "*kill ($key)*";
if (! isset($this->keysTable[ $key ] )) //key dont exisist
{
echo "<pre>error[M4ApplicationsVariable.get]: nu such key</pre>";
exit;
}
$this->destroy($this->keysTable[ $key ] );
$ptr = $this->readKeys();
if ($this->debug == true)
echo "data (in): " . $ptr . "<br>";
$ptr = trim($ptr);
$t = split(",", $ptr);
$tc = count($t);
$nptr = "";
for ($i = 0; $i < $tc;$i++)
{
$tkey = split("=", $t[$i] );
echo "!" . $tkey[0] . "!";
if (strstr($key, $tkey[0]) == false)
{
$this->keysTable[ $tkey[0] ] = $tkey[1];
$nptr .= $tkey[0] . "=" . $tkey[1] . ",";
}
}
if ($this->debug == true)
echo "data (out) " . $nptr . "<br>";
$this->writeKeys($nptr);
}
function destroy($add)
{
$id = shmop_open($add, "c", 0644, $this->keysSize);
if(!shmop_delete($id))
{
echo "<pre>error[M4ApplicationsVariable]: unable to deallocate from memory</pre>";
exit;
}
$this->close($id);
}
function destroySelf()
{
$this->keyHandle = shmop_open($this->keysSysID, "c", 0644, $this->keysSize);
if(!shmop_delete($this->keyHandle))
{
echo "<pre>error[M4ApplicationsVariable]: unable to deallocate from memory</pre>";
exit;
}
$this->close($this->keyHandle);
$this->keyHandle = false;
}
function close($id)
{
shmop_close($id);
}
}
?>