我经常会在网上看到有人问怎么将整个动态的网站静态化,其实实现的方法很简单。
代码如下 | 复制代码 |
<?php //在你的开始处加入 ob_start(); ob_start(); //以下是你的代码 //在结尾加入 ob_end_clean(),并把本页输出到一个变量中 $temp = ob_get_contents(); ob_end_clean(); //写入文件 $fp = fopen(‘文件名’,’w’); fwrite($fp,$temp) or die(‘写文件错误’); ?> |
这只是最基本的方法,还不是很实用,因为网站是要更新的,要定期重新生成HTML
下面是我用的方法:
代码如下 | 复制代码 |
if(file_exists(“xxx.html”)) { $time = time(); //文件修改时间和现在时间相差半小时一下的话,直接导向html文件,否则重新生成html if($time - filemtime(“xxx.html”) < 30*60) { header(“Location:xxx.html”); } } //在你的开始处加入 ob_start(); ob_start(); //页面的详细内容 //在结尾加入 ob_end_clean(),并把本页输出到一个变量中 $temp = ob_get_contents(); ob_end_clean(); //写入文件 $fp = fopen(‘xxx.html’,’w’); fwrite($fp,$temp) or die(‘写文件错误’); //重新导向 header(“Location:xxx.html”); |
上面用的缓存文件在大量生成时会出现负载过重,下面我们介绍一种更为高效的方法
以下是输入内容的提交页面:
文件名:aa.html
代码如下 | 复制代码 |
<html> <form method="post" action="bb.php">
|
以下是代码片段:
文件名:bb.php
代码如下 | 复制代码 |
<?php //定义时间函数(文件名)
//判断今天的文件夹是否存在 //写成html文件 |
如果提示文件写入成功,那你就成功了,然后回到你的相应目录里看看有没有生成静态的html文件!
smarty模板生成方法
代码如下 | 复制代码 |
<?php
|
smarty中有一个获取模板页内容方法fetch(), 它的声明原形是这样的:
代码如下 | 复制代码 |
<?php |
第一个参数为模板名称, 第二个参数为缓存的id, 第三个参数为编译id, 第四个参数为是否显示模板内容. 生成静态页我们就需要用到这个方法.
代码如下 | 复制代码 |
<?php $smarty = new Smarty(); //其它模板替换语法... //下面这句取得页面中所有内容, 注意最后一个参数为false $content = $smarty->fetch('模板名称.tpl', null, null, false); //下面将内容写入至一个静态文件 $fp = fopen('news.html', 'w'); fwrite($fp, $content); fclose($fp); //OK, 到这里这个news.html静态页就生成了, 你可以处理你下一步的工作了 ?> |
好了结合上面的方法我们生成文件几乎原理都一样,先把数据读取出来然后给我们定义好的模板,最后利用fopen函数生成一个.html的文件。
文章介绍了两种方法来实现把mysql数据库中的数据导出成excel文档,各有所长大家可参考一下。我们用最简单的方法直接用php+mysql来实现了,方法如下。
代码如下 | 复制代码 |
<?php include('db/db.php'); //包含连库类 $db = new db(); $result = mysql_query('select * from market_sig into outfile "d:product3.xls";'); var_dump($result); ?> |
上面是我们的原生php结合了mysql outfile文件导出方法,这种方法有个问题就是不能实现下载功能,只在生成在服务器上。
下面方法更全面
下载PHPExcel:http://phpexcel.codeplex.com
先来看看代码,
代码如下 | 复制代码 |
<?php class Table_export extends CI_Controller { function __construct() // Here you should add some sort of user validation function index($table_name) // Starting the PHPExcel library $objPHPExcel = new PHPExcel(); $objPHPExcel->setActiveSheetIndex(0) // Fetching the table data $row++; $objPHPExcel->setActiveSheetIndex(0); $objWriter = IOFactory::createWriter($objPHPExcel, 'Excel5'); //发送标题强制用户下载文件 $objWriter->save('php://output'); } |
看看配置方法吧
1) 解压压缩包里的Classes文件夹中的内容到applicationlibraries目录下,目录结构如下:
-- applicationlibrariesPHPExcel.php
-- applicationlibrariesPHPExcel (文件夹)
2)修改applicationlibrariesPHPExcelIOFactory.php 文件
-- 将其类名从PHPExcel_IOFactory改为IOFactory,遵从CI类命名规则。
-- 将其构造函数改为public
还有很多方法像这种方法多喜欢用,因为phpexcel这个插件很实用,对excel表格操作方便。
首先看看QQWry.Data文件的内容结构 ,以及解读方式 。
一、文件结构
文件主要分三个结构
1、文件头,8个字节;
2、数据记录区,不定长度;
3、索引区,长度为 7 的整数倍;
二、文件头
文件头的8个字节分两部分,每个部分4个字节,分别指定了索引区的开始地址和结束地址。所以可以通过两个地址的差值 除 7 后 加 1 可以计算出总的记录数。
二、记录区
记录区的数据需要通过索引区的数据来获得各个数据的起始位置;本区数据记录了IP地址的结束地址和地区字符串;所有地区字符串都以 0×00 为结束。
三、索引区
检索IP对应的地区,关键就是找到IP起始地址对应的索引内容。一个IP索引数据包含7个字节,前4个字节是IP地址起始值,后3个字节是对应的IP数据 记录在文件内的偏移地址;IP数据记录中,前 4 个字节是IP结束地址;紧跟的数据有两种模式: 0×01 模式 和 0×02 模式。
0×01模式,即在IP数据的第5个字节是 0×01,则在后面的 3 个字节是国家地区数据的偏移地址;国家地区数据包括国家和地区这两个字符串。即
—————————————————————
4字节 | 3字节 重定向 0x NN NN NN -> 国家地区数据的文件偏移地址
—————————————————————
0×02模式,即在IP数据的第5个字节是 0×02,则在后面的 3 个字节是国家数据的偏移地址,地区数据是再往后的字符串,以 0×00 截至。即
—————————————————————————–
4字节 | 3字节 重定向 0x NN NN NN -> 国家数据的文件偏移地址 | 地区字符串 | 0×00
—————————————————————————–
对于 0×01 模式所得到的 国家地区数据中,它可能又带有一个重定向结构,即
————————————–
国家字符串 | 0×00 | 地区字符串 | 0×00
————————————–
或
————————————————————————-
国家字符串 | 0×00 | 0×02 | 3字节 0x NN NN NN -> 地区字符串的文件偏移地址
————————————————————————-
对于前一种情况,比较简单,直接读出两个字符串数据就可以了;对于后一种情况,需要再次重定向到地区字符串的偏移地址,然后读取到 0×00 为字符串结尾。
对于这种采取地址映射实际字符串值的方式,主要作用是避免重复记录字符串值。在整个IP地址库文件中,有太多相同字符串记录了,采用 3 字节的映射地址要比重复记录字符串值节省太多空间了。
PHP代码读取操作QQWry.dat文件 :
代码如下 | 复制代码 |
function bin2ip($bin){ //-------------------------------------------------- $index_begin = implode('', unpack('L', $c)); $ip_num = ($index_end - $index_begin) / 7 + 1; echo "index begin at: $index_beginn"; $output = ''; for($i = 0; $i < $ip_num; $i++){ //文件指针指到每个IP数据文件的索引取得索引数据(7字节)上 $ip3 = fread($f, 3); //IP记录偏移地址 $dataseek = implode('', unpack('L', $ip3 . chr(0))); //指向记录区 $dataseek 位置查找记录 $area = ''; //读一个标记位 $flag = fread($f, 1); //如果地区是重定向的 |
这个函数我们看到最多的就是文件操作相关函数如fopen,fseek,fread这些,有需要的朋友可以看看。
RSS订阅功能,在很多网站都可以有但也有很多,下面代码是自己写的,其中使用到了一个PHP类:RSS.class.php,感觉非常方便,不敢独享,特拿出来跟大家分享。代码如下 | 复制代码 |
include_once("class/RSS.class.php");//引入RSS PHP类 |
全部代码如下:
代码如下 | 复制代码 |
<?php // +---------------------------------------------------------------------- // | YBlog // +---------------------------------------------------------------------- // | Copyright (c) 2008 http://www.111cn.net/nokia/n97/ All rights reserved. // +---------------------------------------------------------------------- // +---------------------------------------------------------------------- // | Author: yhustc <yhustc@gmail.com> // +---------------------------------------------------------------------- // $Id$ /** +------------------------------------------------------------------------------ * RSS生成类 +------------------------------------------------------------------------------ * @author yhustc <yhustc@gmail.com> * @version $Id$ +------------------------------------------------------------------------------ */ class RSS { /** +---------------------------------------------------------- * RSS频道名 +---------------------------------------------------------- * @var string * @access protected +---------------------------------------------------------- */ protected $channel_title = ''; /** +---------------------------------------------------------- * RSS频道链接 +---------------------------------------------------------- * @var string * @access protected +---------------------------------------------------------- */ protected $channel_link = ''; /** +---------------------------------------------------------- * RSS频道描述 +---------------------------------------------------------- * @var string * @access protected +---------------------------------------------------------- */ protected $channel_description = ''; /** +---------------------------------------------------------- * RSS频道使用的小图标的URL +---------------------------------------------------------- * @var string * @access protected +---------------------------------------------------------- */ protected $channel_imgurl = ''; /** +---------------------------------------------------------- * RSS频道所使用的语言 +---------------------------------------------------------- * @var string * @access protected +---------------------------------------------------------- */ protected $language = 'zh_CN'; /** +---------------------------------------------------------- * RSS文档创建日期,默认为今天 +---------------------------------------------------------- * @var string * @access protected +---------------------------------------------------------- */ protected $pubDate = ''; protected $lastBuildDate = ''; protected $generator = 'YBlog RSS Generator'; /** +---------------------------------------------------------- * RSS单条信息的数组 +---------------------------------------------------------- * @var string * @access protected +---------------------------------------------------------- */ protected $items = array(); /** +---------------------------------------------------------- * 构造函数 +---------------------------------------------------------- * @access public +---------------------------------------------------------- * @param string $title RSS频道名 * @param string $link RSS频道链接 * @param string $description RSS频道描述 * @param string $imgurl RSS频道图标 +---------------------------------------------------------- */ public function __construct($title, $link, $description, $imgurl = '') { $this->channel_title = $title; $this->channel_link = $link; $this->channel_description = $description; $this->channel_imgurl = $imgurl; $this->pubDate = Date('Y-m-d H:i:s', time()); $this->lastBuildDate = Date('Y-m-d H:i:s', time()); } /** +---------------------------------------------------------- * 设置私有变量 +---------------------------------------------------------- * @access public +---------------------------------------------------------- * @param string $key 变量名 * @param string $value 变量的值 +---------------------------------------------------------- */ public function Config($key,$value) { $this->{$key} = $value; } /** +---------------------------------------------------------- * 添加RSS项 +---------------------------------------------------------- * @access public +---------------------------------------------------------- * @param string $title 日志的标题 * @param string $link 日志的链接 * @param string $description 日志的摘要 * @param string $pubDate 日志的发布日期 +---------------------------------------------------------- */ function AddItem($title, $link, $description, $pubDate) { $this->items[] = array('title' => $title, 'link' => $link, 'description' => $description, 'pubDate' => $pubDate); } /** +---------------------------------------------------------- * 输出RSS的XML为字符串 +---------------------------------------------------------- * @access public +---------------------------------------------------------- * @return string +---------------------------------------------------------- */ public function Fetch() { $rss = "<?xml version="1.0" encoding="utf-8" ?>rn"; $rss = "<rss version="2.0">rn"; $rss .= "<channel>rn"; $rss .= "<title><![CDATA[{$this->channel_title}]]></title>rn"; $rss .= "<description><![CDATA[{$this->channel_description}]]></description>rn"; $rss .= "<link>{$this->channel_link}</link>rn"; $rss .= "<language>{$this->language}</language>rn"; if (!empty($this->pubDate)) $rss .= "<pubDate>{$this->pubDate}</pubDate>rn"; if (!empty($this->lastBuildDate)) $rss .= "<lastBuildDate>{$this->lastBuildDate}</lastBuildDate>rn"; if (!empty($this->generator)) $rss .= "<generator>{$this->generator}</generator>rn"; $rss .= "<ttl>5</ttl>rn"; if (!empty($this->channel_imgurl)) { $rss .= "<image>rn"; $rss .= "<title><![CDATA[{$this->channel_title}]]></title>rn"; $rss .= "<link>{$this->channel_link}</link>rn"; $rss .= "<url>{$this->channel_imgurl}</url>rn"; $rss .= "</image>rn"; } for ($i = 0; $i < count($this->items); $i++) { $rss .= "<item>rn"; $rss .= "<title><![CDATA[{$this->items[$i]['title']}]]></title>rn"; $rss .= "<link>{$this->items[$i]['link']}</link>rn"; $rss .= "<description><![CDATA[{$this->items[$i]['description']}]]></description>rn"; $rss .= "<pubDate>{$this->items[$i]['pubDate']}</pubDate>rn"; $rss .= "</item>rn"; } $rss .= "</channel>rn</rss>"; return $rss; } /** +---------------------------------------------------------- * 输出RSS的XML到浏览器 +---------------------------------------------------------- * @access public +---------------------------------------------------------- * @return void +---------------------------------------------------------- */ public function Display() { header("Content-Type: text/xml; charset=utf-8"); echo $this->Fetch(); exit; } } ?> |
上传类使用ORG类库包中的Net.UpdateFile类,最新版本的上传类包含的功能如下(有些功能需要结合ThinkPHP系统其他类库):
1.基本上传功能
2.支持批量上传
3.支持生成图片缩略图
4. 自定义参数上传
5.上传检测(包括大小、后缀和类型)
6.支持上传类型、附件大小、上传路径定义
7.支持哈希或者日期子目录保存上传文件
8.上传图片的安全性检测
9.支持上传文件命名规则
10. 支持对上传文件的Hash验证
在ThinkPHP中使用上传功能无需进行特别处理。例如,下面是一个带有附件上传的表单提交:
代码如下 | 复制代码 |
<form METHOD=POST action=“/Manual/upload” enctype=“multipart/form-data” > <input type=“text” NAME=“name” > <input type=“text” NAME=“email” > <input type=“file” name=“photo” > <input type=“submit” value=“保 存” > </form> |
注意表单的Form标签中一定要添加 enctype=”multipart/form-data” 文件才能上传。因为表单提交到当前模块的upload操作方法,所以我们在模块类里面添加下面的upload方法即可:
代码如下 | 复制代码 |
Public function upload(){ import(“ORG.Net.UploadFile”); $upload = new UploadFile(); // 实例化上传类 $upload->maxSize = 3145728 ; // 设置附件上传大小 $upload->allowExts = array(‘jpg’, ‘gif’, ‘png’, ‘jpeg’); // 设置附件上传类型 $upload->savePath = ‘./Public/Uploads/’; // 设置附件上传目录 if(!$upload->upload()) { // 上传错误 提示错误信息 $this->error($upload->getErrorMsg()); }else{ // 上传成功 获取上传文件信息 $info = $upload->getUploadFileInfo(); } // 保存表单数据 包括附件数据 $User = M(“User”); // 实例化User对象 $User->create(); // 创建数据对象 $User->photo = $info[0]["savename"]; // 保存上传的照片 根据需要自行组装 $User->add(); // 写入用户数据到数据库 $this->success(“数据保存成功!”); } |
首先是实例化上传类
代码如下 | 复制代码 |
import(“ORG.Net.UploadFile”); $upload = new UploadFile(); // 实例化上传类 |
实例化上传类之后,就可以设置一些上传的属性(参数),支持的属性有:
maxSize: 文件上传的最大文件大小(以字节为单位)默认为-1 不限大小
savePath:文件保存路径,如果留空会取UPLOAD_PATH常量定义的路径
saveRule:上传文件的保存规则,必须是一个无需任何参数的函数名,例如可以是 time、 uniqid com_create_guid 等,但必须能保证生成的文件名是唯一的,默认是uniqid
hashType:上传文件的哈希验证方法,默认是md5_file
autoCheck:是否自动检测附件,默认为自动检测
uploadReplace:存在同名文件是否是覆盖
allowExts:允许上传的文件后缀(留空为不限制),使用数组设置,默认为空数组
allowTypes:允许上传的文件类型(留空为不限制),使用数组设置,默认为空数组
thumb:是否需要对图片文件进行缩略图处理,默认为false
thumbMaxWidth:缩略图的最大宽度,多个使用逗号分隔
thumbMaxHeight:缩略图的最大高度,多个使用逗号分隔
thumbPrefix:缩略图的文件前缀,默认为thumb_ (如果你设置了多个缩略图大小的话,请在此设置多个前缀 )
thumbSuffix:缩略图的文件后缀,默认为空 (如果你设置了多个缩略图大小的话,请在此设置多个后缀 )
thumbPath:缩略图的保存路径,留空的话取文件上传目录本身
thumbFile:指定缩略图的文件名
thumbRemoveOrigin:生成缩略图后是否删除原图
autoSub:是否使用子目录保存上传文件
subType:子目录创建方式,默认为hash,可以设置为hash或者date
dateFormat:子目录方式为date的时候指定日期格式
hashLevel:子目录保存的层次,默认为一层
以上属性都可以直接设置,例如:
代码如下 | 复制代码 |
$upload->thumb = true $upload->thumbMaxWidth = “50,200″ $upload->thumbMaxHeight = “50,200″ |
其中生成缩略图功能需要Image类的支持。
设置好上传的参数后,就可以调用 UploadFile类的upload方法进行附件上传,如果失败,返回false,并且用getErrorMsg方法获取错误提示信息;如果上传成功, 可以通过调用getUploadFileInfo方法获取成功上传的附件信息列表。因此getUploadFileInfo方法的返回值是一个数组,其中 的每个元素就是上传的附件信息。每个附件信息又是一个记录了下面信息的数组,包括:
key:附件上传的表单名称
savepath:上传文件的保存路径
name:上传文件的原始名称
savename:上传文件的保存名称
size:上传文件的大小
type:上传文件的MIME类型
extension:上传文件的后缀类型
hash:上传文件的哈希验证字符串
文件上传成功后,就可以通过这些附件信息来进行其他的数据存取操作,例如保存到当前数据表或者单独的附件数据表都可以。
如果需要使用多个文件上传,只需要修改表单,把
XML/HTML代码
代码如下 | 复制代码 |
<input type=“file” name=“photo”> |
改为
XML/HTML代码
代码如下 | 复制代码 |
<input type=“file” name=“photo1″> 或者 PHP代码 |
两种方式的多附件上传系统的文件上传类都可以自动识别。