首页 > 编程技术 > php

php实现文件数据缓存实现代码

发布时间:2016-11-25 16:26

缓存技术是每次访问页面的时候,都会先检测相应的缓存是否存在,如果不存在,就连接数据库,得到数据,完成模板变量的赋值,显示页面,同时生成缓存文件,这样下次访问的时候缓存文件就发挥作用了

而不会再执行if块的数据查询语句了。当然,在实际使用中会有很多东西要考虑,比如,有效期的设置,缓存组的设置等等

<?php 
class cacheexception extends exception {} 
/**
 * 缓存抽象类
 */ 
abstract class cache_abstract { 
    /**
     * 读缓存变量
     *
     * @param string $key 缓存下标
     * @return mixed
     */ 
    abstract public function fetch($key); 
     
    /**
     * 缓存变量
     *
     * @param string $key 缓存变量下标
     * @param string $value 缓存变量的值
     * @return bool
     */ 
    abstract public function store($key, $value); 
     
    /**
     * 删除缓存变量
     *
     * @param string $key 缓存下标
     * @return cache_abstract
     */ 
    abstract public function delete($key); 
     
    /**
     * 清(删)除所有缓存
     *
     * @return cache_abstract
     */ 
    abstract public function clear(); 
     
    /**
     * 锁定缓存变量
     *
     * @param string $key 缓存下标
     * @return cache_abstract
     */ 
    abstract public function lock($key); 
 
    /**
     * 缓存变量解锁
     *
     * @param string $key 缓存下标
     * @return cache_abstract
     */ 
    abstract public function unlock($key); 
 
    /**
     * 取得缓存变量是否被锁定
     *
     * @param string $key 缓存下标
     * @return bool
     */ 
    abstract public function islocked($key); 
 
    /**
     * 确保不是锁定状态
     * 最多做$tries次睡眠等待解锁,超时则跳过并解锁
     *
     * @param string $key 缓存下标
     */ 
    public function checklock($key) { 
        if (!$this->islocked($key)) { 
            return $this; 
        } 
         
        $tries = 10; 
        $count = 0; 
        do { 
            usleep(200); 
            $count ++; 
        } while ($count <= $tries && $this->islocked($key));  // 最多做十次睡眠等待解锁,超时则跳过并解锁 
 
        $this->islocked($key) && $this->unlock($key); 
         
        return $this; 
    } 

 
 
/**
 * apc扩展缓存实现
 * 
 * 
 * @category   mjie
 * @package    cache
 * @author     流水孟春
 * @copyright  copyright (c) 2008- <cmpan(at)qq.com>
 * @license    new bsd license
 * @version    $id: cache/apc.php 版本号 2010-04-18 23:02 cmpan $
 */ 
class cache_apc extends cache_abstract { 
     
    protected $_prefix = 'cache.mjie.net'; 
     
    public function __construct() { 
        if (!function_exists('apc_cache_info')) { 
            throw new cacheexception('apc extension didn't installed'); 
        } 
    } 
     
    /**
     * 保存缓存变量
     *
     * @param string $key
     * @param mixed $value
     * @return bool
     */ 
    public function store($key, $value) { 
        return apc_store($this->_storagekey($key), $value); 
    } 
     
    /**
     * 读取缓存
     *
     * @param string $key
     * @return mixed
     */ 
    public function fetch($key) { 
        return apc_fetch($this->_storagekey($key)); 
    } 
     
    /**
     * 清除缓存
     *
     * @return cache_apc
     */ 
    public function clear() { 
        apc_clear_cache(); 
        return $this; 
    } 
     
    /**
     * 删除缓存单元
     *
     * @return cache_apc
     */ 
    public function delete($key) { 
        apc_delete($this->_storagekey($key)); 
        return $this; 
    } 
     
    /**
     * 缓存单元是否被锁定
     *
     * @param string $key
     * @return bool
     */ 
    public function islocked($key) { 
        if ((apc_fetch($this->_storagekey($key) . '.lock')) === false) { 
            return false; 
        } 
         
        return true; 
    } 
     
    /**
     * 锁定缓存单元
     *
     * @param string $key
     * @return cache_apc
     */ 
    public function lock($key) { 
        apc_store($this->_storagekey($key) . '.lock', '', 5); 
        return $this; 
    } 
     
    /**
     * 缓存单元解锁
     *
     * @param string $key
     * @return cache_apc
     */ 
    public function unlock($key) { 
        apc_delete($this->_storagekey($key) . '.lock'); 
        return $this; 
    } 
     
    /**
     * 完整缓存名
     *
     * @param string $key
     * @return string
     */ 
    private function _storagekey($key) { 
        return $this->_prefix . '_' . $key; 
    } 

 
/**
 * 文件缓存实现
 * 
 * 
 * @category   mjie
 * @package    cache
 * @author     流水孟春
 * @copyright  copyright (c) 2008- <cmpan(at)qq.com>
 * @license    new bsd license
 * @version    $id: cache/file.php 版本号 2010-04-18 16:46 cmpan $
 */ 
class cache_file extends cache_abstract { 
    public $usesubdir     = false; 
     
    protected $_cachesdir = 'cache'; 
     
    public function __construct() { 
        if (defined('data_dir')) { 
            $this->_setcachedir(data_dir . '/cache'); 
        } 
    } 
     
    /**
     * 获取缓存文件
     *
     * @param string $key
     * @return string
     */ 
    protected function _getcachefile($key) { 
        $subdir = $this->usesubdir ? substr($key, 0, 2) . '/' : ''; 
        return $this->_cachesdir . '/' . $subdir . $key . '.php'; 
    } 
 
    /**
     * 读取缓存变量
     * 为防止信息泄露,缓存文件格式为php文件,并以"<?php exit;?>"开头
     * 
     * @param string $key 缓存下标
     * @return mixed
     */ 
    public function fetch($key) { 
        $cachefile = self::_getcachefile($key); 
        if (file_exists($cachefile) && is_readable($cachefile)) { 
            // include 方式 
            //return include $cachefile; 
            // 系列化方式 
 
            return unserialize(@file_get_contents($cachefile, false, null, 13)); 
        } 
 
        return false; 
    } 
 
    /**
     * 缓存变量
     * 为防止信息泄露,缓存文件格式为php文件,并以"<?php exit;?>"开头
     *
     * @param string $key 缓存变量下标
     * @param string $value 缓存变量的值
     * @return bool
     */ 
    public function store($key, $value) { 
        $cachefile = self::_getcachefile($key); 
        $cachedir  = dirname($cachefile); 
 
        if(!is_dir($cachedir)) { 
            if(!@mkdir($cachedir, 0755, true)) { 
                throw new cacheexception("could not make cache directory"); 
            } 
        } 
    // 用include方式 
        //return @file_put_contents($cachefile, '<?php return ' . var_export($value, true). ';'); 
 
        return @file_put_contents($cachefile, '<?php exit;?>' . serialize($value)); 
    } 
 
    /**
     * 删除缓存变量
     *
     * @param string $key 缓存下标
     * @return cache_file
     */ 
    public function delete($key) { 
        if(emptyempty($key)) { 
            throw new cacheexception("missing argument 1 for cache_file::delete()"); 
        } 
         
        $cachefile = self::_getcachefile($key); 
        if(!@unlink($cachefile)) { 
            throw new cacheexception("cache file could not be deleted"); 
        } 
 
        return $this; 
    } 
 
    /**
     * 缓存单元是否已经锁定
     *
     * @param string $key
     * @return bool
     */ 
    public function islocked($key) { 
        $cachefile = self::_getcachefile($key); 
        clearstatcache(); 
        return file_exists($cachefile . '.lock'); 
    } 
 
    /**
     * 锁定
     *
     * @param string $key
     * @return cache_file
     */ 
    public function lock($key) { 
        $cachefile = self::_getcachefile($key); 
        $cachedir  = dirname($cachefile); 
        if(!is_dir($cachedir)) { 
            if(!@mkdir($cachedir, 0755, true)) { 
                if(!is_dir($cachedir)) { 
                    throw new cacheexception("could not make cache directory"); 
                } 
            } 
        } 
 
        // 设定缓存锁文件的访问和修改时间 
        @touch($cachefile . '.lock'); 
        return $this; 
    } 
   
    /**
     * 解锁
     *
     * @param string $key
     * @return cache_file
     */ 
    public function unlock($key) { 
        $cachefile = self::_getcachefile($key); 
        @unlink($cachefile . '.lock'); 
        return 

下面来看一款关于smarty缓存的文件实例代码

再来看看smarty提供的页面缓存功能:

 

 1<?php

  2require('smarty.class.php');

  3$smarty = new smarty;

  4$smarty->caching = true;

  5if(!$smarty->is_cached('index.tpl')) {

  6 // no cache available, do variable assignments here.

  7 $contents = get_database_contents();

  8 $smarty->assign($contents);

  9}

  10$smarty->display('index.tpl');

  11?>

php缓存技术工作时,当程序查询数据的时候,会把相应的结果序列化后保存到文件中,以后同样的查询语句就可以不用直接查询数据库,而是从缓存文件中获得。这一改进使得程序运行速度得以太幅度提升.

 

下面的代码就是我通过我的数据库教程读取出文件路径并最终实现批量修改rar文件注释的方法.因为数据库是access,我新建了一个odbc源.同时rar.exe及cmd.exe都在1.php教程同目录下

 

<?
$id=$_get[id];
if($id=="")
{
echo "参数错误";
exit;
}
if($id>=400)
{
echo "全部结束";
exit;
}
$db=odbc_connect("dw","","");
$sql="select * from 'download' where 'id'=$id";
$query=odbc_exec($db,$sql);
$filename=odbc_result($query,2);
if($filename=="")
{

}
$filename=str_replace("#1′,"",$filename);
$filename=str_replace("#2′,"",$filename);
$filename="soft/".$filename;
echo $filename."<br>";
if(!file_exists($filename))
{
echo "文件不存在,转到下一个id";
$id++;
echo "<meta http-equiv='refresh'

content='0;url=../test/1.php?id=$id'>";
exit;
}//读出文件名,并检查文件是否存在
else
{
'winrar a $filename 使用说明.txt';
echo "插入说明文件成功";
$id++;
echo "<meta http-equiv='refresh' content='0;url=../test/1.php?id=$id'>";
}
odbc_close($db);
?>

<body>
<form action="curlupload.php" method="post" enctype="multipart/form-data">
<div>
<label for="upload">select file</label>
<input name="upload" type="file" />
<input type="submit" name="submit" value="upload" />
</div>
</form>
</body>
</html>
<?
if (isset($_post['submit'])) {
 if (!empty($_files['upload']['name'])) {
     $ch = curl_init();
     $localfile = $_files['upload']['tmp_name'];
     $fp = fopen($localfile, 'r');
     curl_setopt($ch, curlopt_url, 'ftp://ftp_login:password@ftp.domain.com/'.$_files['upload']['name']);
     curl_setopt($ch, curlopt_upload, 1);
     curl_setopt($ch, curlopt_infile, $fp);
     curl_setopt($ch, curlopt_infilesize, filesize($localfile));
     curl_exec ($ch);
     $error_no = curl_errno($ch);
     curl_close ($ch);
        if ($error_no == 0) {
            $error = 'file uploaded succesfully.';
        } else {
            $error = 'file upload error.';
        }
 } else {
        $error = 'please select a file.';
 }
}
?>

好了下面封闭成类了

<?php
class curl_ftp
{
   
    private $ftpname;          //ftp用户名
    private $ftppaw;           //ftp密码
    private $urlftp;           //ftp地址
    private $filename;         //文件名
   
    public __construct($name, $password, $ftp)
    {
        $this->ftpname  = $name;
        $this->ftppaw   = $password;
        $this->urlftp   = $ftp;
 //    $this->filename = $filename;
    }
   
    public function getftp()
    {
        if (isset($_post['submit']))
      {
         if (!empty($_files['upload']['name']))
         {
             $ch = curl_init();
             $this->filename = $_files['upload']['tmp_name'];
             $fp = fopen($this->filename, 'r');
             curl_setopt($ch, curlopt_url, $this->ftp.$this->filename);
            curl_setopt($ch, curlopt_userpwd, "$name:password");
             curl_setopt($ch, curlopt_upload, 1);
             curl_setopt($ch, curlopt_infile, $fp);
             curl_setopt($ch, curlopt_infilesize, filesize($this->filename));
             curl_exec ($ch);
             $error_no = curl_errno($ch);
             curl_close ($ch);
                if ($error_no == 0)
                {
                    $error = '文件上传成功';
                }
                else
                {
                    $error = '文件上传失败';
                }
         }
         else
         {
                $error = '未选择文件';
         }
  }
    }
}

用php教程可扩展特性实现可以远程保存游戏用户日志信息,这里我暂时叫他tlog(与文件服务器建立tcp/ip连接,当然最好是udp),目前定义了三个函数
tlog_init,tlog_record,tlog_close
tlog_init(ip,port)用来连接文件服务器其中ip,port分别为文件服务器地址和端口
tlog_record(message,file)用户发送要记录的日志内容和日志保存的文件
tlog_close为关闭发送日志产生的socket链接

<?php
$result = tlog_init("127.0.0.1", 9734);
if ($result) {
    tlog_record("hello" . time(), '1.log');
    tlog_record("hello world" . time(), '2.log');
    tlog_close();
}
?>

我们主要修改config.m4,tlog.c,php_tlog.h实现我们要的功能
   打开config.m4,
  删除 php_arg_enable(tlog, whether to enable tlog support, 行开始注释dnl
  删除[  --enable-tlog           enable tlog support]) 行开始注释dnl
  打开php_tlog.h 增加


php_function(tlog_init);
php_function(tlog_record);
php_function(tlog_close);

外t_log.c见包
  以上步骤后进入tlog目录执行
   ./你的php安装目录/bin/phpize 我的目录为/usr/local/webserver/php5.3.3,则该命令./usr/local/webserver/php5.3.3/bin/phpize
./configure --with-php-config=/usr/local/webserver/php5.3.3/bin/php-config
make
sudo make install  (因为我使用的ubuntu,所以带了sudo主要是php安装目录创建扩展时的权限问题)

修改php.ini增加tlog.so扩展

查看phpinfo();

用户提交自己的信息后,保存在数据库教程中,程序每一次读取当前结果时都要判断一次,如用户可设置几秒钟时参加竞拍,竞拍多少次,并且可以设置前面有多少人竞拍后我才参加,都是一些人性化的功能//自动出价

function auto($second,$gid,$shutuid)
{
        global $table_prefix;
        //取出此商品已经竞拍次数
        $maxnumber=0;
        $unumber=array();
        $query=mysql教程_query("select id,uid from `".$table_prefix."buylog` where gid=".$gid);
        while($rows=mysql_fetch_assoc($query))
        {
                $maxnumber++;
                if(isset($unumber[$rows['uid']]))
                {
                        $unumber[$rows['uid']]++;
                }
                else
                {
                        $unumber[$rows['uid']]=0;
                }
        }
       
        //取出自动竞拍的会员
        $sql="select uid,username,number,second,maxnumber,gid,ip from `".$table_prefix."autobuy` where gid=".$gid;
        $query=mysql_query($sql);
        $allow=array();
        $shutuid=explode(',',$shutuid);
        while($rows=mysql_fetch_assoc($query))
        {
                $seconds=explode(',',$rows['second']);
                $unumber[$rows['uid']]=isset($unumber[$rows['uid']])?$unumber[$rows['uid']]:0;
                if(in_array($second,$seconds) && !in_array($rows['uid'],$shutuid) && $rows['maxnumber']<=$maxnumber && $rows['number']>$unumber[$rows['uid']]) //包含时刻,并且不在黑名单,符合此会员竞拍次数设置
                {
                        $allow[]=$rows['uid'];
                }
        }
        $allowuser=array();
        if($allow)
        {
                $query=mysql_query('select uid,username,money,ip from `'.$table_prefix.'user` where uid in ('.implode(',',$allow).')');
                while($rows=mysql_fetch_assoc($query))
                {
                        $allowuser[]=$rows;
                }
        }
        unset($allow,$sql,$number,$maxnumber,$shutuid,$query,$u);
        return $allowuser;
}
标签:[!--infotagslink--]

您可能感兴趣的文章: