mirror of
https://github.com/phpbb/phpbb.git
synced 2025-07-11 20:27:04 +02:00
phpBB
adm
cache
develop
docs
files
images
includes
acm
acm_db.php
acm_file.php
auth
db
mcp
ucp
bbcode.php
functions.php
functions_admin.php
functions_compress.php
functions_display.php
functions_jabber.php
functions_messenger.php
functions_module.php
functions_posting.php
functions_privmsgs.php
functions_profile_fields.php
functions_user.php
index.htm
message_parser.php
session.php
template.php
install
language
store
styles
common.php
config.php
download.php
faq.php
index.php
mcp.php
memberlist.php
posting.php
report.php
search.php
style.php
ucp.php
viewforum.php
viewonline.php
viewtopic.php
301 lines
6.1 KiB
PHP
301 lines
6.1 KiB
PHP
<?php
|
|
// -------------------------------------------------------------
|
|
//
|
|
// $Id$
|
|
//
|
|
// FILENAME : acm_file.php
|
|
// STARTED : Sat Feb 13, 2001
|
|
// COPYRIGHT : © 2003 phpBB Group
|
|
// WWW : http://www.phpbb.com/
|
|
// LICENCE : GPL vs2.0 [ see /docs/COPYING ]
|
|
//
|
|
// -------------------------------------------------------------
|
|
|
|
class acm
|
|
{
|
|
var $vars = array();
|
|
var $var_expires = array();
|
|
var $is_modified = FALSE;
|
|
|
|
var $sql_rowset = array();
|
|
|
|
function acm()
|
|
{
|
|
global $phpbb_root_path;
|
|
$this->cache_dir = $phpbb_root_path . 'cache/';
|
|
}
|
|
|
|
function load()
|
|
{
|
|
global $phpEx;
|
|
if (file_exists($this->cache_dir . 'data_global.' . $phpEx))
|
|
{
|
|
@include($this->cache_dir . 'data_global.' . $phpEx);
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function unload()
|
|
{
|
|
$this->save();
|
|
unset($this->vars);
|
|
unset($this->var_expires);
|
|
unset($this->sql_rowset);
|
|
}
|
|
|
|
function save()
|
|
{
|
|
if (!$this->is_modified)
|
|
{
|
|
return;
|
|
}
|
|
|
|
global $phpEx;
|
|
$file = '<?php $this->vars=' . $this->format_array($this->vars) . ";\n\$this->var_expires=" . $this->format_array($this->var_expires) . ' ?>';
|
|
|
|
if ($fp = @fopen($this->cache_dir . 'data_global.' . $phpEx, 'wb'))
|
|
{
|
|
@flock($fp, LOCK_EX);
|
|
fwrite($fp, $file);
|
|
@flock($fp, LOCK_UN);
|
|
fclose($fp);
|
|
}
|
|
|
|
$this->is_modified = FALSE;
|
|
}
|
|
|
|
function tidy()
|
|
{
|
|
global $phpEx;
|
|
|
|
$dir = opendir($this->cache_dir);
|
|
while ($entry = readdir($dir))
|
|
{
|
|
if (!preg_match('/^(sql_|data_(?!global))/', $entry))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
$expired = TRUE;
|
|
include($this->cache_dir . $entry);
|
|
if ($expired)
|
|
{
|
|
unlink($this->cache_dir . $entry);
|
|
}
|
|
}
|
|
@closedir($dir);
|
|
|
|
if (file_exists($this->cache_dir . 'data_global.' . $phpEx))
|
|
{
|
|
if (!sizeof($this->vars))
|
|
{
|
|
$this->load();
|
|
}
|
|
|
|
foreach ($this->var_expires as $var_name => $expires)
|
|
{
|
|
if (time() > $expires)
|
|
{
|
|
$this->destroy($var_name);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function get($var_name)
|
|
{
|
|
if ($var_name{0} == '_')
|
|
{
|
|
global $phpEx;
|
|
|
|
include($this->cache_dir . 'data' . $var_name . ".$phpEx");
|
|
return (isset($data)) ? $data : NULL;
|
|
}
|
|
else
|
|
{
|
|
return ($this->exists($var_name)) ? $this->vars[$var_name] : NULL;
|
|
}
|
|
}
|
|
|
|
function put($var_name, $var, $ttl = 31536000)
|
|
{
|
|
if ($var_name{0} == '_')
|
|
{
|
|
global $phpEx;
|
|
|
|
if ($fp = @fopen($this->cache_dir . 'data' . $var_name . ".$phpEx", 'wb'))
|
|
{
|
|
@flock($fp, LOCK_EX);
|
|
fwrite($fp, "<?php\n\$expired = (time() > " . (time() + $ttl) . ") ? TRUE : FALSE;\nif (\$expired) { return; }\n\n\$data = unserialize('" . str_replace("'", "\\'", str_replace('\\', '\\\\', serialize($var))) . "');\n?>");
|
|
@flock($fp, LOCK_UN);
|
|
fclose($fp);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$this->vars[$var_name] = $var;
|
|
$this->var_expires[$var_name] = time() + $ttl;
|
|
$this->is_modified = TRUE;
|
|
}
|
|
}
|
|
|
|
function destroy($var_name, $table = '')
|
|
{
|
|
global $phpEx;
|
|
|
|
if ($var_name == 'sql' && !empty($table))
|
|
{
|
|
$regex = '(' . ((is_array($table)) ? implode('|', $table) : $table) . ')';
|
|
|
|
$dir = opendir($this->cache_dir);
|
|
while ($entry = readdir($dir))
|
|
{
|
|
if (substr($entry, 0, 4) != 'sql_')
|
|
{
|
|
continue;
|
|
}
|
|
|
|
$fp = fopen($this->cache_dir . $entry, 'rb');
|
|
$file = fread($fp, filesize($this->cache_dir . $entry));
|
|
@fclose($fp);
|
|
|
|
if (preg_match('#/\*.*?\W' . $regex . '\W.*?\*/#s', $file, $m))
|
|
{
|
|
unlink($this->cache_dir . $entry);
|
|
}
|
|
}
|
|
@closedir($dir);
|
|
}
|
|
elseif ($var_name{0} == '_')
|
|
{
|
|
@unlink($this->cache_dir . 'data' . $var_name . ".$phpEx");
|
|
}
|
|
elseif (isset($this->vars[$var_name]))
|
|
{
|
|
$this->is_modified = TRUE;
|
|
unset($this->vars[$var_name]);
|
|
unset($this->var_expires[$var_name]);
|
|
}
|
|
}
|
|
|
|
function exists($var_name)
|
|
{
|
|
if ($var_name{0} == '_')
|
|
{
|
|
global $phpEx;
|
|
return file_exists($this->cache_dir . 'data' . $var_name . ".$phpEx");
|
|
}
|
|
else
|
|
{
|
|
if (!sizeof($this->vars))
|
|
{
|
|
$this->load();
|
|
}
|
|
|
|
if (!isset($this->var_expires[$var_name]))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return (time() > $this->var_expires[$var_name]) ? false : isset($this->vars[$var_name]);
|
|
}
|
|
}
|
|
|
|
function format_array($array)
|
|
{
|
|
$lines = array();
|
|
foreach ($array as $k => $v)
|
|
{
|
|
if (is_array($v))
|
|
{
|
|
$lines[] = "'$k'=>" . $this->format_array($v);
|
|
}
|
|
elseif (is_int($v))
|
|
{
|
|
$lines[] = "'$k'=>$v";
|
|
}
|
|
elseif (is_bool($v))
|
|
{
|
|
$lines[] = "'$k'=>" . (($v) ? 'TRUE' : 'FALSE');
|
|
}
|
|
else
|
|
{
|
|
$lines[] = "'$k'=>'" . str_replace("'", "\\'", str_replace('\\', '\\\\', $v)) . "'";
|
|
}
|
|
}
|
|
return 'array(' . implode(',', $lines) . ')';
|
|
}
|
|
|
|
function sql_load($query)
|
|
{
|
|
global $phpEx;
|
|
|
|
// Remove extra spaces and tabs
|
|
$query = preg_replace('/[\n\r\s\t]+/', ' ', $query);
|
|
$query_id = 'Cache id #' . count($this->sql_rowset);
|
|
|
|
if (!file_exists($this->cache_dir . 'sql_' . md5($query) . ".$phpEx"))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
@include($this->cache_dir . 'sql_' . md5($query) . ".$phpEx");
|
|
|
|
if (!isset($expired))
|
|
{
|
|
return FALSE;
|
|
}
|
|
elseif ($expired)
|
|
{
|
|
unlink($this->cache_dir . 'sql_' . md5($query) . ".$phpEx");
|
|
return FALSE;
|
|
}
|
|
|
|
return $query_id;
|
|
}
|
|
|
|
function sql_save($query, &$query_result, $ttl)
|
|
{
|
|
global $db, $phpEx;
|
|
|
|
// Remove extra spaces and tabs
|
|
$query = preg_replace('/[\n\r\s\t]+/', ' ', $query);
|
|
|
|
if ($fp = @fopen($this->cache_dir . 'sql_' . md5($query) . '.' . $phpEx, 'wb'))
|
|
{
|
|
@flock($fp, LOCK_EX);
|
|
|
|
$lines = array();
|
|
$query_id = 'Cache id #' . sizeof($this->sql_rowset);
|
|
$this->sql_rowset[$query_id] = array();
|
|
|
|
while ($row = $db->sql_fetchrow($query_result))
|
|
{
|
|
$this->sql_rowset[$query_id][] = $row;
|
|
|
|
$lines[] = "unserialize('" . str_replace("'", "\\'", str_replace('\\', '\\\\', serialize($row))) . "')";
|
|
}
|
|
$db->sql_freeresult($query_result);
|
|
|
|
fwrite($fp, "<?php\n\n/*\n$query\n*/\n\n\$expired = (time() > " . (time() + $ttl) . ") ? TRUE : FALSE;\nif (\$expired) { return; }\n\n\$this->sql_rowset[\$query_id] = array(" . implode(',', $lines) . ') ?>');
|
|
@flock($fp, LOCK_UN);
|
|
fclose($fp);
|
|
|
|
$query_result = $query_id;
|
|
}
|
|
}
|
|
|
|
function sql_exists($query_id)
|
|
{
|
|
return isset($this->sql_rowset[$query_id]);
|
|
}
|
|
|
|
function sql_fetchrow($query_id)
|
|
{
|
|
return array_shift($this->sql_rowset[$query_id]);
|
|
}
|
|
}
|
|
?>
|