Sep
25
功能很简单,就是缓存整个页面,可以设定缓存时间,可以缓存特定的URL,例如:test.php?id=12,当目标文件更新时,如test.php,缓存文件也会更新,即使仍处于缓存期内。
{
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;
}
}
}
用法:
$ch = new cache();
echo date("D M j G:i:s T Y");
$ch->close();
Sep
24
MVC就不多说了,网上到处都是,各种framework基本都是基于mvc的,但是学习一个模板的代价也挺大的,而且效率也是个问题,所以我就自己实现了一下。
先来看看index.php,一共三句话,当然这是最基本的,其他功能可以自己扩展
再来看看config.php,里面定义了一些常量
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");
Sep
22
从两个pdf文件里总结出来的
统一的命名规则(命名空间)
类的首字母要大写
函数名小写,用"_"隔开
私有变量,私有方法前面加"_"
对应的文件夹下面放对应的文件,类似Zend
也就是可以通过字符串名,来推断文件的位置
Vendor_Auth_TypeKey => Vendor/Auth/TypeKey.php先定义一个INCLUDE_PATH,之后通过它来引入其他文件。
不要使用全局变量
编程和样式标准
使代码可读,不仅是自己
文档,注释,测试
易扩展
函数之前,要有函数的相关解释,如作用,参数
文件组织范例
index.php
page1.php
page2.phpsections/
index.php
section1.php
section2.php
...inc/
index.php
header.php
footer.php
...lib/
foo.class.php
class1/
class2/
...bin/
cache/
cron/
css/
docs/
imgs/
install/
js/
log/
sql/
theme/
tpl/
Sep
21
crontab是一个能让你定时执行特定程序的一个软件,运行于linux下。
昨天在测试的时候一直没有能够执行,可把我给郁闷毁了,今天终于被我找到原因了,分享下经验
- 在/usr/lib/cron/cron.deny里出现的用户将不能执行crontab
- 如果在该目录下既没有cron.allow又没有cron.deny,那么只有root用户能够执行crontab
- 在ubuntu下面这个目录应该在/etc下面
- 每次任务执行成功时,会向你的邮箱里发邮件(它是怎么知道我的邮箱的?)
- 如果不想发到邮箱里,可以在任务的最后加上">/dev/null 2>&1"
- 如果要执行gui程序,需要在程序名前加上"env DISPLAY=:0."
- 程序路径最好使用绝对路径
Sep
20
原理就是判断来源,如果来源为空,或者来源是本网站,那么可以正常显示图片,不然就给你来个403,当然也可以处理一下403,来显示另一张图片
SetEnvIfNoCase Referer "^http://www\.live-my-life-with-yuyi\.com" local_ref=1 SetEnvIfNoCase Referer "^$" local_ref=1Order 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,事情就方便了。
Sep
20
ADOdb是一个php的数据库抽象类,也有python版本,这里讨论的是php版。
老家在:http://adodb.sourceforge.net/主要是为快速开发而设计的,同时兼容各类主流数据库软件。
我比较喜欢里面的active record模式,这个是模仿Zend Framework的Zend_Db_DataObject,最主要的优点就是几乎不用写SQL语句,把主要精力集中在数据的处理上,而不是与数据库的交互上。也就是所谓的ORM
这里只是简要概括一下主要功能,更详细的应用请参考文档
地址:http://phplens.com/lens/adodb/docs-active-record.htm
首先引入两个文件,然后建立ADO连接,并设置默认的适配器
require("../adodb/adodb.inc.php");
$db =NewADOConnection('mysql://root:123456@localhost/test');
ADOdb_Active_Record::SetDatabaseAdapter($db);
然后就可以继承父类了
如果不设置$_table的话,那么数据库的表名就是类名,在这里就是mydb(类名要大写,表名会自动转换成小写)
这样设置了后,就可以很方便地操作数据库了,比如要添加一条新的记录,可以执行
$my_db->title="something new";
$my_db->create = time();
$my_db->save();
需要注意的是,对于数据库中设置的not null的字段,一定不能为null,不然会报错。
查看新插入的id(如果主键是其他值,用该值替换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")
当然也可以自己定义删除多条数据的函数。
就先讲这么多啦,发点牢骚,官方的说明文档真是太简明扼要了,而且有好些功能应该加进去,比如选取多条记录和删除多条记录,而不是让我们在子类中再去实现。
