php实现文件数据缓存实现代码
而不会再执行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;
}
相关文章
- 下面小编来给大家演示几个php操作zip文件的实例,我们可以读取zip包中指定文件与删除zip包中指定文件,下面来给大这介绍一下。 从zip压缩文件中提取文件 代...2016-11-25
Jupyter Notebook读取csv文件出现的问题及解决
这篇文章主要介绍了JupyterNotebook读取csv文件出现的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2023-01-06- 这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
- 有一种方法,可以不打开网站而直接查看到这个网站的源代码.. 这样可以有效地防止误入恶意网站... 在浏览器地址栏输入: view-source:http://...2016-09-20
- <?php require('path.inc.php'); header('content-Type: text/html; charset=utf-8'); $borough_id = intval($_GET['id']); if(!$borough_id){ echo ' ...2016-11-25
- 有时我们接受或下载到的PSD文件打开是空白的,那么我们要如何来解决这个 问题了,下面一聚教程小伙伴就为各位介绍Photoshop打开PSD文件空白解决办法。 1、如我们打开...2016-09-14
- C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
- 这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
- 这篇文章主要介绍了C#实现HTTP下载文件的方法,包括了HTTP通信的创建、本地文件的写入等,非常具有实用价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要为大家详细介绍了SpringBoot实现excel文件生成和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-09
- 本文实例讲述了JS基于Mootools实现的个性菜单效果代码。分享给大家供大家参考,具体如下:这里演示基于Mootools做的带动画的垂直型菜单,是一个初学者写的,用来学习Mootools的使用有帮助,下载时请注意要将外部引用的mootools...2015-10-23
- 本文实例讲述了JS+CSS实现分类动态选择及移动功能效果代码。分享给大家供大家参考,具体如下:这是一个类似选项卡功能的选择插件,与普通的TAb区别是加入了动画效果,多用于商品类网站,用作商品分类功能,不过其它网站也可以用,...2015-10-21
- 本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
- 这篇文章主要介绍了IDEA中的clean,清除项目缓存图文教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-25
- php 取除连续空格与换行代码,这些我们都用到str_replace与正则函数 第一种: $content=str_replace("n","",$content); echo $content; 第二种: $content=preg_replac...2016-11-25
php无刷新利用iframe实现页面无刷新上传文件(1/2)
利用form表单的target属性和iframe 一、上传文件的一个php教程方法。 该方法接受一个$file参数,该参数为从客户端获取的$_files变量,返回重新命名后的文件名,如果上传失...2016-11-25- php简单用户登陆程序代码 这些教程很对初学者来讲是很有用的哦,这款就下面这一点点代码了哦。 <center> <p> </p> <p> </p> <form name="form1...2016-11-25
- 要替换字符串中的内容我们只要利用php相关函数,如strstr,str_replace,正则表达式了,那么我们要替换目录所有文件的内容就需要先遍历目录再打开文件再利用上面讲的函数替...2016-11-25
- 公司一些wordpress网站由于下载的插件存在恶意代码,导致整个服务器所有网站PHP文件都存在恶意代码,就写了个简单的脚本清除。恶意代码示例...2015-10-23
- 又码了一个周末的代码,这次在做一些关于文件上传的东西。(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来...2016-11-25