Typecho签名图片生成之PHP缓存机制学习(一)

作者:跑调,发布于May 13, 2010,这是一篇关于typecho,php,签名,图片,缓存类,cache,gd的文章

  这两天我在{强}博客生活志中自己做了一个typecho的签名图片,用php实现(不是photoshop……)的,主要是为了学习一下GD库的简单使用。实现出来以后,小张主机群里的朋友又说这样会增加系统的负载,因为每次访问这个图片都要访问一次数据库并且生成图片。还告诉我可以使用缓存,将typecho博客签名图片输出到缓存中,于是又学习了一下PHP的缓存代码。

  由于首要目的是实现这个图片,所以我没有深究这个缓存的高级内容,只是引用了别人的一个PHP缓存类。这是一个很简单的PHP缓存类,主要思想就是根据时间判断是否更新缓存,如果需要更新,那么从数据库中读取文章列表并生成图片;如果不需要更新且缓存文件存在,那么直接输出缓存文件内容。


  首先放出我写的typecho博客签名图片生成的代码,我的typecho博客签名图片的文件名是sn.php[此处我去掉了缓存类,因为我无法确定该缓存类是否安全可靠,如果有bug,请各位哥手下留情不要黑我,而我更不希望因为我的无知给他人造成损失。网上的缓存类很多,完全可以找到一个健壮的php缓存类来代替我目前所用

query($sql);
$db->close();
header("Content-type: image/png");
$imgname = 'sign.png';//背景图,自己做的
$im = @imagecreatefrompng($imgname);
$white = imagecolorallocate($im, 255, 255, 255);
$grey = imagecolorallocate($im, 69,69,69);
$black = imagecolorallocate($im, 0, 0, 0);
$font = 'msyh.ttf';//此处要将字体文件放入到响应的目录,因为要用它来向图片中“写”汉字,否则乱码!
$size=9; //字号
$y = 48;//第一行的下边到图片顶端的距离
while($row=$db->fetch_array($rs)){
$time =date('[d/m] ', $row['created']);//输出格式为[05.12] 这里是一个标题……
$title=(mb_strlen($row['title'])>16)?mb_substr( $row['title'],0,16,'utf-8')."......":$row['title'];
//设置文字长度
//此处在我本机调试时可以实现16个汉字截断加“......”
//不满16个字正常输出的要求
//但是放主机上就全带了,奇怪了
$output = $time.$title;//拼合字符串
imagettftext ($im, $size, 0, 5, $y, $black, $font, $output);
//输出大小为$font的字符串$output到图片$im,位置是距左边5px,第一行的下边距离图片上边$y,颜色为$black,字体为$font
$y=$y+17;下一行的下边距离上一行底边17px
}
imagepng($im);
imagedestroy($im);
$ch->close();//还是更换掉比较好些
?>

  代码就是这些了,其实我自己都没有消化掉,只是东拼西凑的拿来主义。准备写一个typecho的主题了,名字叫什么呢?So Amazing!

实例下载:放到typecho根目录下,配置mysql.php中的数据库。
typecho图片签名.zip

已有 8 条评论 »

  1. 瑶哥 July 29th, 2010 at 12:49 pm

    好强大的东西!

  2. 跑调 July 26th, 2010 at 08:36 pm

    需要上传汉字字体文件到相应目录…………可能这个问题吧。再就是cache文件夹的权限问题,还有就是数据库连接…………

  3. 熠熠 July 26th, 2010 at 03:23 pm

    我弄好了,但是只显示图片不显示文字~~~
    为什么?

  4. bojone July 23rd, 2010 at 09:45 am

    请问缓存类cache.php是通用的吗?

  5. bojone July 22nd, 2010 at 10:45 pm

    或者发一份到我的邮箱可以不?

  6. bojone July 22nd, 2010 at 10:40 pm

    请问打包在哪?

  7. 跑调 July 22nd, 2010 at 11:46 am

    @bojone
    我打包了一个,你放你typecho根目录下,然后在mysql.php文件中配置数据库就行了。

  8. bojone July 22nd, 2010 at 09:07 am

    可以给我一个现成的例子吗?代码我发现用不了,而且我的php知识少得可怜

添加新评论 »