PHP一个小巧的缓存类

文章分类:PHP | 发表评论  查看次数:413 + 88

功能很简单,就是缓存整个页面,可以设定缓存时间,可以缓存特定的URL,例如:test.?id=12,当目标文件更新时,如test.,缓存文件也会更新,即使仍处于缓存期内。

class cache
{
    var $cache_dir = './cache/';//This is the directory where the cache files will be stored;
    var $cache_time = 120;//How much time will keep the cache files in seconds.

    var $caching = false;
    var $file = '';

    function cache()
    {
    //Constructor of the class
    $this->file = $this->cache_dir . urlencode( $_SERVER['REQUEST_URI'] );
    if(file_exists($this->file)) $expired = $this->check_expire();
    else $expired = false;
    if ( file_exists ( $this->file ) && ( filemtime ( $this->file ) + $this->cache_time ) > time() && !$expired )
    {
        //Grab the cache:
        $handle = fopen( $this->file , "r");
        do {
        $data = fread($handle, 8192);
        if (strlen($data) == 0) {
            break;
        }
        echo $data;
        } while (true);
        fclose($handle);
        exit();
    }
    else
    {
        //create cache :
        $this->caching = true;
        ob_start();
        $now = time();
        echo "<!--last modified:".$now."-->\n";
    }
    }

    function close()
    {
    //You should have this at the end of each page
    if ( $this->caching )
    {
        //You were caching the contents so display them, and write the cache file
        $data = ob_get_clean();
        echo $data;
        $fp = fopen( $this->file , 'w' );
        fwrite ( $fp , $data );
        fclose ( $fp );
    }
    }
    function check_expire(){
    $fp = fopen($this->file,"r");
    preg_match("/\:([\d]+)\-/",fread($fp,200),$time);
    $modify_time = $time[1];
    if($modify_time<filemtime($_SERVER['SCRIPT_FILENAME'])){
        return true;
    }
    else{
        return false;
    }

    }
}
 

用法:

//Example :
$ch = new cache();
echo date("D M j G:i:s T Y");
$ch->close();
 

PHP——简单的单入口MVC的实现

文章分类:PHP | 发表评论  查看次数:497 + 88

MVC就不多说了,网上到处都是,各种framework基本都是基于mvc的,但是学习一个模板的代价也挺大的,而且效率也是个问题,所以我就自己实现了一下。

先来看看index.,一共三句话,当然这是最基本的,其他功能可以自己扩展

require("config.");
require("function.");
require("dispatcher.");
 

再来看看config.,里面定义了一些常量

//server info
define("HOST","localhost");
define("USER","root");
define("PASSWORD","123456");
define("DATABASE","article");

//path info
define("INCLUDE_PATH",dirname(__FILE__));

//controller
define("CONTROLLER_PATH",INCLUDE_PATH."/controller");
 

Read more

PHP编程小提示

文章分类:PHP | 发表评论  查看次数:346 + 84

从两个pdf文件里总结出来的

统一的命名规则(命名空间)

类的首字母要大写
函数名小写,用"_"隔开
私有变量,私有方法前面加"_"
对应的文件夹下面放对应的文件,类似Zend
也就是可以通过字符串名,来推断文件的位置
Vendor_Auth_TypeKey => Vendor/Auth/TypeKey.

先定义一个INCLUDE_PATH,之后通过它来引入其他文件。

不要使用全局变量

编程和样式标准

使代码可读,不仅是自己

文档,注释,测试

易扩展

函数之前,要有函数的相关解释,如作用,参数

文件组织范例
index.
page1.
page2.

sections/
index.
section1.
section2.
...

inc/
index.
header.
footer.
...

lib/
foo.class.
class1/
class2/
...

bin/
cache/
cron/
css/
docs/
imgs/
install/
js/
log/
sql/
theme/
tpl/

crontab的一些tips

文章分类:misc | 发表评论  查看次数:324 + 85

crontab是一个能让你定时执行特定程序的一个软件,运行于linux下。

昨天在测试的时候一直没有能够执行,可把我给郁闷毁了,今天终于被我找到原因了,分享下经验

  • 在/usr/lib/cron/cron.deny里出现的用户将不能执行crontab
  • 如果在该目录下既没有cron.allow又没有cron.deny,那么只有root用户能够执行crontab
  • 在ubuntu下面这个目录应该在/etc下面
  • 每次任务执行成功时,会向你的邮箱里发邮件(它是怎么知道我的邮箱的?)
  • 如果不想发到邮箱里,可以在任务的最后加上">/dev/null 2>&1"
  • 如果要执行gui程序,需要在程序名前加上"env DISPLAY=:0."
  • 程序路径最好使用绝对路径

通过Apache来防止图片被盗链

文章分类:apache | 发表评论  查看次数:370 + 77

原理就是判断来源,如果来源为空,或者来源是本网站,那么可以正常显示图片,不然就给你来个403,当然也可以处理一下403,来显示另一张图片

SetEnvIfNoCase Referer "^http://www\.live-my-life-with-yuyi\.com" local_ref=1
SetEnvIfNoCase Referer "^$" local_ref=1

Order Allow,Deny
Allow from env=local_ref

ErrorDocument 403 http://www.live-my-life-with-yuyi.com/lab/error.jpg

将上面这段代码另存为.htaccess,存放到对应的图片目录下,比如图片目录是upload/images,那么就它的位置就是upload/.htaccess,将第一句话里的域名改为自己的域名即可。

比如下面这张图片,因为是我自己的网站,所以显示正常,如果在其他论坛引用这个图片的话,将会看到另一张图片

可以试一下:地址是
http://www.live-my-life-with-yuyi.com/lab/temp/images/qian.jpg

PS:测试的时候,由于缓存原因,真是害我走了不少弯路

话又说回来了,不让引用也没关系,有了imgred,事情就方便了。

了解一下ADOdb的active record

文章分类:misc | 发表评论  查看次数:389 + 84

是一个的数据库抽象类,也有python版本,这里讨论的是版。

老家在:http://adodb.sourceforge.net/主要是为快速开发而设计的,同时兼容各类主流数据库软件。

我比较喜欢里面的模式,这个是模仿Zend Framework的Zend_Db_DataObject,最主要的优点就是几乎不用写SQL语句,把主要精力集中在数据的处理上,而不是与数据库的交互上。也就是所谓的ORM

这里只是简要概括一下主要功能,更详细的应用请参考文档

地址:http://phplens.com/lens/adodb/docs-active-record.htm

首先引入两个文件,然后建立ADO连接,并设置默认的适配器

require("..//-active-record.inc.");
require("..//.inc.");
$db =NewADOConnection('mysql://root:123456@localhost/test');
ADOdb_Active_Record::SetDatabaseAdapter($db);
 

然后就可以继承父类了

class Mydb extends ADOdb_Active_Record(){$_table = "my_db"}
 

如果不设置$_table的话,那么数据库的表名就是类名,在这里就是mydb(类名要大写,表名会自动转换成小写)
这样设置了后,就可以很方便地操作数据库了,比如要添加一条新的记录,可以执行

$my_db = new Mydb();
$my_db->title="something new";
$my_db->create = time();
$my_db->save();
 

需要注意的是,对于数据库中设置的not null的字段,一定不能为null,不然会报错。

查看新插入的id(如果主键是其他值,用该值替换id即可)

echo $my_db->id;
 

如果要更新某条记录

//先载入该条记录
$my_db->load("id=1");
$my->db->titile = "updated value";
$my_db->save();
 

这样就完成了对id=1的记录的更新

如果要删除一条记录

$my_db->id=1;
$my_db->delete();

这样就完成了删除

如果还要添加自己的方法,可以在Mydb里定义,比如选择多条数据

function GetRows($whereorderby="1=1",$field="*"){
if($field!="*"){
if(is_array($field)){
$field = implode(",",$field);
}
}
$db =& $this->DB();if(!$db) return false;
$rs = $db->Execute("select $field from $this->_table where $whereorderby");
return $rs->GetRows();

}

可以这么调用:

$data = $date->GetRows("id>30","title")

当然也可以自己定义删除多条数据的函数。

就先讲这么多啦,发点牢骚,官方的说明文档真是太简明扼要了,而且有好些功能应该加进去,比如选取多条记录和删除多条记录,而不是让我们在子类中再去实现。

共5页 1 2 3 4 5 下一页