Penner Blog

Sarah & Penner’s happy life ;)

Archive for the ‘PHP’ Category

Smarty的缓存操作[ZT]

  • Filed under: PHP, Tech
星期日
6 1,2008

一、使用缓存
要开启Smarty的缓存,只需将caching设为true,并指定cache_dir即可.
使用cache_lefetime指定缓存生存时间,单位为秒,要对相同页面生成多个不同的缓存,在display或fetch中加入第二参数cache_id,如:

//此特性可用于对不同的$_GET进行不同的缓存
$smarty->display('index.tpl',$my_cache_id);

二、清除缓存

clear_all_cache();//清除所有缓存
clear_cache('index.tpl');//清除index.tpl的缓存
clear_cache('index.tpl',cache_id);//清除指定id的缓存

三、使用自定义缓存方式
设置cache_handler_func使用自定义的函数处理缓存,如:

$smarty->cache_handler_func = "myCache";
function myCache($action, &$smarty_obj, &$cache_content, $tpl_file=null, $cache_id=null, $compile_id=null) {
}

该函数的一般是根椐$action来判断缓存当前操作:

switch($action) {
    
case "read"://读取缓存内容
    
case "write"://写入缓存
    
case "clear"://清空
}

一般使用md5($tpl_file.$cache_id.$compile_id)作为唯一的cache_id
如果需要,可使用gzcompress和gzuncompress来压缩和解压

四、局部关闭缓存
要在某些区域使缓存失效(只对需要的缓存),有几种方法:
inser:
定义一个inser标签要使用的处理函数,函数名格式为:insert_xx(array $params, object &$smarty)其中的xx是insert的name,也就是说,如果你定义的函数为insert_abc,则模板中使用方法为{insert name=’abc’}
参数通过$params传入
也可以做成insert插件,文件名命名为:insert.xx.php,函数命名为:smarty_insert_aa($params,&$smarty),xx定义同上register_block:

// 定义一个block
smarty_block_name($params,$content, &$smarty) {return $content;} //name表示区域名
 
//注册block
$smarty->register_block('name', 'smarty_block_name', false); //第三参数false表示该区域不被缓存

模板写法:{name}内容{/name}

写成block插件:
1)定义一件插件函数:block.cacheless.php,放在smarty的plugins目录
block.cacheless.php的内容如下:

<?php
function smarty_block_cacheless($param, $content, &$smarty) {
    
return $content;
}
?>

2) 编写程序及模板
示例程序:testCacheLess.php

<?php
include('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching = true;
$smarty->cache_lifetime = 6;
$smarty->display('cache.tpl');
?>

所用的模板:cache.tpl

已经缓存的:{$smarty.now}
{cacheless}
没有缓存的:{$smarty.now}
{/cacheless}

PHP Download File

  • Filed under: PHP, Tech
星期日
5 25,2008
  1. <?php
  2. $filename = $_GET['filename'];
  3.  
  4. // Modify this line to indicate the location of the files you want people to be able to download
  5. // This path must not contain a trailing slash. ie. /temp/files/download
  6. $download_path = "ficheros/";
  7.  
  8. // Make sure we can't download files above the current directory location.
  9. if(eregi("\.\.", $filename)) die("I'm sorry, you may not download that file.");
  10. $file = str_replace("..", "", $filename);
  11.  
  12. // Make sure we can't download .ht control files.
  13. if(eregi("\.ht.+", $filename)) die("I'm sorry, you may not download that file.");
  14.  
  15. // Combine the download path and the filename to create the full path to the file.
  16. $file = "$download_path$file";
  17.  
  18. // Test to ensure that the file exists.
  19. if(!file_exists($file)) die("I'm sorry, the file doesn't seem to exist.");
  20.  
  21. // Extract the type of file which will be sent to the browser as a header
  22. $type = filetype($file);
  23.  
  24. // Get a date and timestamp
  25. $today = date("F j, Y, g:i a");
  26. $time = time();
  27.  
  28. // Send file headers
  29. header("Content-type: $type");
  30. header("Content-Disposition: attachment;filename=$filename");
  31. header("Content-Transfer-Encoding: binary");
  32. header('Pragma: no-cache');
  33. header('Expires: 0');
  34. // Send the file contents.
  35. set_time_limit(0);
  36. readfile($file);
  37. ?>
星期二
9 25,2007

前一阵子网站新上了相册功能,可最近总发现有一些用户上传的图片文件链接失效,代码检查了很多次,测试也做的比较充分了,但还是会出现上传失败的问题,很是郁闷,今天终于找到了解决办法。

从备份源中找到了用户上传失败的JPG图片,进行上传测试,上传完成后页面提示:

Warning: imagecreatefromjpeg(): ‘/tmp/lalala’ is not a valid JPEG file in /path/upload.php on line 1

出现这个Warning是由于GD函数库检测发现是非标准JPEG图片格式导致。

解决方法,如果PHP版本 > 5.1.3,可以在php.ini中增加:
gd.jpeg_ignore_warning = 1

在 MIME 类型中有 image/jpeg 与 image/pjpeg 两种,GD库只认识前者的传统格式,后者是 progressive JPEG 的缩写,啥是pjpeg昵?

这个链接中有详细的解释:
http://www.faqs.org/faqs/jpeg-faq/part1/section-11.html

另外,php.net 中也有相关问题的详细讨论,有兴趣的朋友可以进去看看:
http://bugs.php.net/bug.php?id=29878

PHP中时间运算

  • Filed under: PHP, Tech
星期三
3 28,2007
  1. $tomorrow = date("Y-m-d", mktime(0,0,0,4,1+1,2005));
  2.  
  3. $tomorrow = date("Y-m-d", mktime(0,0,0,date("m") ,date("d")+1,date("Y"))); //明天
  4.  
  5. $yesterday = date("Y-m-d", mktime(0,0,0,date("m") ,date("d")-1,date("Y"))); //昨天
  6.  
  7. $lastmonth = date("Y-m-d", mktime(0,0,0,date("m")-1,date("d"), date("Y"))); //上一个月
  8.  
  9. $nextyear = date("Y-m-d", mktime(0,0,0,date("m"), date("d", date("Y")+1)); //下一年
  10.  
  11. $today = date("Ymd",strtotime ("+1 day"));
  12.  
  13. $date1="2006-08-09″;
  14. echo date(’Y-m-d’,strtotime("$date1 +5 day")); //相应地,要增加月,年,将day改成month或year即可
  15. ?>
星期三
4 6,2005

关闭整体目录的PHP解析权限

关闭路径为f:/www/site/easy2run/的PHP解析

<Directory "f:/www/site/easy2run/">
    <Files ~ ".php">
        Order allow,deny
        Deny from all
    </Files>
</Directory>

对于某一个特定网址(虚拟主机VirtualHost)进行PHP解析限制

关闭IP为127.0.0.1的PHP解析

<VirtualHost 127.0.0.1>
...
    <Files ~ ".php">
        Order allow,deny
        Deny from all
    </Files>
</VirtualHost>

用PHP删除目录

  • Filed under: PHP, Tech
星期一
11 15,2004

PHP本身有一个rmdir()函数可以用来删除目录,不过要求必须是空目录。

  1. <?php
  2. function removeDir($dirName)
  3. {
  4.     $result = false;
  5.     if(! is_dir($dirName))
  6.     {
  7.         trigger_error("目录名称错误", E_USER_ERROR);
  8.     }
  9.     $handle = opendir($dirName);
  10.     while(($file = readdir($handle)) !== false)
  11.     {
  12.         if($file != '.' && $file != '..')
  13.         {
  14.             $dir = $dirName . DIRECTORY_SEPARATOR . $file;
  15.             is_dir($dir) ? removeDir($dir) : unlink($dir);
  16.         }
  17.     }
  18.     closedir($handle);
  19.     $result = rmdir($dirName) ? true : false;
  20.     return $result;
  21. }
  22. ?>

用PHP MAIL()函数发送HTML邮件

  • Filed under: PHP, Tech
星期五
7 30,2004

发送HTML邮件时的PHP代码,编写时参考了发送MIME邮件教程。
MIME信息头有:

MIME-Version:
这个头提供了所用MIME的版本号。这个值习惯上为1.0。

Content-Type:
它定义了数据的类型,以便数据能被适当的处理。有效的类型有:text,image,audio,video,applications,multipart和message。注意任何一个二进制附件都应该被叫做application/octet-stream。这个头的一些用例为:image/jpg, application/mswork,multipart/mixed,这只是很少的一部分。

Content-Transfer-Encoding:
这是所有头中最重要的一个,因为它说明了对数据所执行的编码方式,客户/MUA将用它对附件进行解码。对于每个附件,可以使用7bit,8bit,binary ,quoted-printable,base64和custom中的一种编码方式。7bit编码是用在US ASCII字符集上的常用的一种编码方式,也就是,保持它的原样。8bit和binary编码一般不用。对人类可读的标准文本,如果传输要经过对格式有影响的网关时对其进行保护,可以使用quoted printable。Base64是一种通用方法,在需要决定使用哪一种编码方法时,它提供了一个不用费脑子的选择;它通常用在二进制,非文本数据上。注意,任何非7bit数据必须用一种模式编码,这样它就可以通过Internet邮件网关!

Content-ID:
如果Content-Type是message/external-body或multipart/alternative时,这个头就有用了。它超出了本文的范围。

Content-Description:
这是一个可选的头。它是任何信息段内容的自由文本描述。描述必须使用us-ascii码。

Content-Disposition:
一个试验性的头,它用于给客户程序/MUA提供提示,来决定是否在行内显示附件或作为单独的附件。
MIME段头(出现在实际的MIME附件部分的头),除了MIME-Version头,可以拥有以上任何头字段。如果一个MIME头是信息块的一部分,它将作用于整个信息体。例如,如果Content-Transfer-Encoding显示在信息(指整个信息)头中,它应用于整个信息体,但是如果它显示在一个MIME段里,它”只能”用于那个段中。
|inline

星期日
7 18,2004

php&more来源地址
http://www.phpmore.com/

很喜欢其中的两篇文章!
第一篇
《PHP中的面向对象和面向过程》
推荐等级:
  还是学生时代时,我的C++老师就给我讲过这两个概念,但那会儿对这些东西根本不感兴趣,相对于学习书本上的知识我更喜欢,吼吼~~~
  现在工作了,每天基本上就是和电脑、代码打交道,才懂得了什么叫书到用时方恨少……

第二篇 更喜欢了
《编程之道》
推荐等级:
  摘录一些其中一些经典话语!

Design
Book Three
编程大师如是说:
“程序被测试时再去改变它的设计已经太晚了。”

Mainteance
Book Five
编程大师如是说:“既使一个程序只有三行长,也总有一天需要去维护它”

5.2
经理问程序员要多长时间才能完成他的项目。
“明天。”
“太不着边际了,老实说,要多久?”
程序员想了一想说。“还有一些新的功能要加进去,可能至少要两个星期吧。”
“即使两个星期恐怕也太夸张了,什么时候你只要告诉我说程序已经完成就好了。”
几年后,这个经理已经退休了,在他的离职午餐上,他发现这些程序员在他的终端前睡着了,他整夜都在编程。

5.4
一个好的农民不会不管他的庄稼。
一个好的老师不会不管哪怕是最差的学生。
一个好的父亲不会让他的任何一个孩子挨饿。
一个好的程序员不应拒绝维护他的程序。

Management
Book Six
编程大师如是说:
“增加程序员,减少经理–这样他们都可提高效率。”

6.1
为什么程序员没有效率,因为他们把时间都浪费在开会上了。
为什么程序员难于管理?因为管理者的干预太多了。
为什么程序员一个接一个地辞职,因为他们累坏了。
在糟糕的管理下工作,他们享受不到工作的乐趣。

6.3
一个经理将被解雇,但他手下的一个程序员写了一个流行的软件并且销路很旺。所以经理保住了他的工作。
经理为程序员分红,但程序员拒绝了,他说:“我写程序是因为写程序很有趣,所以我并没想过得资金”。
这位经理说,“这位程序员,不管他现在是什么位置,他都能理解一个雇员的职责所在。我们要把他提升为管理顾问”。
这位程序员又一次拒绝了,他说:“我是一个程序员所以我可以编程,如果我被提升了,除了浪费别人的时间什么也做不了,现在我可以走了吗?我还有一个程序没写完。”

6.4
经理对程序员说,“你们的工作时间是早上9 点到正午12 点。”
所有的程序员都很不满。
经理又说:“好吧,那随你们的便,只要能按时完成任务。”
程序员们这下满意了,他们中午上班,一直工作到凌晨。

7.4
编程大师从一个项目转到另一个项目而毫无顾虑,任何管理上的变动都不能影响他,他不会被解雇,即使项目被取消了。
为什么呢?
他了解了道。

Hardware and
Software
Book Eight
编程大师如是说:
风不动则草不动,没有软件,硬件只是一堆发热的电子器件

8.2
有一天编程大师碰见了一个正玩掌上游戏机的编程新手,他说:“给我看一下?”
新手把游戏机递给大师,“我看到上面说明了三种难度的玩法:容易,中等,高难”,大师说,“但是每个这样的游戏机都有另外一种玩法,此时游戏机既不是想着怎么赢你,也不是怎么被你赢。”
“那么请问大师”,初学者说,“这种玩法到底是怎样玩的呢?”
大师把游戏机摔到地下然后用脚踩碎它,突然初学者明白了。

Epilogue
Book Nine
编程大师如是说:
“现在是你出师的时候了。”