1、首页静态化
后台管理我们的内容:增加、删除、修改、查询
1.1 前台首页面,手动更新!
点击更新缓存,就访问一次newsList.php,去数据库把数据查询出来,然后echo到ob缓存中
利用ob缓存ob_get_contents();
file_put_contents把内容保存到../index.html,就是前端的首页
1.2 插入或者更新后,就立刻自动更新缓存
只需要在newsAction.php(插入数据)里面,添加include "newsList.php";
cannot modify header has already send 的waring,
这个是因为写了多次header("content-type:text/html;charset:utf-8");
1.3 有些日排行榜,一天只需要更新一次,就做个定时器,定期更新首页。
1.4 真静态优缺点:
1.4.1 利于seo
1.4.2 访问速度快:不用查数据库,不用执行php模块,防止sql注入
1.4.3 生成大量的html文件,占用磁盘空间。如果所以的文件都放入
同一个文件夹,就会出问题。应该按照年月日来分开。
linux的save_mode打开,那么创建文件夹权限失败。
门户网站:新闻、文章查询cms,基本都要用真静态
1.4.4 不适用真静态:
1.4.4.1 网站或页面实时性很高,如股票、基金每秒就更新
1.4.4.2 数据量很大,同时一次查询一次后,以后很少查询
1.4.4.3 电信查询系统,因为查询很少,而且每个月一般只查询一次。
1.4.4.4 有些网站是保密的,不希望被seo抓取
2、伪静态技术:
2.1 不需要真静态,但是希望利于seo,就可以使用伪静态
2.2 实现方式,直接使用正则表达式来完成
2.3 apache/nginx 自带的rewrite机制来完成
3、正则表达式:
输入的url是:
http://www.1366768.com/blog.php/1,2,332,12.html
但是后台处理时当成
http://www.1366768.com/blog.php/a=1&b=2&c=332&d=12.html
3.1 可以用string处理 str_split(); 但是这个不灵和,安全性不高
<?php
echo "<pre>";
print_r($_SERVER);
echo "</pre>";
3.2 使用正则来处理。
$str = "asadklfja:3423:;sdf5555sd:3443:as2222df2:003kjrui32982";
//查找字符串中连续4个数的内容 3423 5555 3443 2222 3298
$reg = '/\d\d\d\d/i';
preg_match($reg, $str, $match);
print_r($match);
//将会打出3423
preg_match_all($reg, $str, $match);
print_r($match);
//将会打出 3423 5555 3443 2222 3298
$reg = '/(\d)\d\d\d/i'; //这样的话,就又不一样了
3.3 概念:
1. 字表达式
2. 捕获
3. 反向引用
$reg = '/(\d)\d\d\d/i';
这里的(\d)就是字表达式,字表达试会被捕获起来
eg:
$str = "ret11111sadfa-asdfad222-asd5555fa333";
找出连续的相同的3个数字
//说明:正则规范的格式:/规范/i i表示匹配时,不区分大小写
\d 表示任意一个数字0-9,
(\d)表示一个字表达式
\1 代表反向引用,或者说是:第一个表达式的内容,应该出现的内容
{3} 表示出现3次
字表达式
$reg = '/(\d)\1{3}/i';
preg_match($reg, $str, $match);
print_r($match);
//实例0
$str="111-222-333ksadf;k333-222-444kfjs";
//xxx-yyy-zzz
$reg = '/(\d)\1{2}-(\d)\2{2}-(\d)\3{2}/i';
preg_match($reg, $str, $match);
print_r($match);
//实例1
$str="111-575-111ksadf;k333-060-333kfjs";
//xxx-yzy-xxx
//$reg = '/(\d)\1{2}-(\d)(\d)\2-\1{3}/i';
$reg = '/(\d)\1{2}-(\d)\d\2-\1{3}/i';
preg_match($reg, $str, $match);
echo "<pre>";
print_r($match);
/*
Array
(
[0] => 111-575-111
[1] => 1 //就是第一个子表达式的内容
[2] => 5 //就是滴二个字表达式的内容
)
*/
//实例2
$str="111-575-111ksadf;k333-060-333kfjs";
//xxx-yzy-xxx
$reg = '/(\d)\1{2}-(\d)\d\2-\1{3}/i';
preg_match_all($reg, $str, $match);
echo "<pre>";
print_r($match);
/*
Array
(
[0] => Array
(
[0] => 111-575-111
[1] => 333-060-333
)
[1] => Array
(
[0] => 1
[1] => 3
)
[2] => Array
(
[0] => 5
[1] => 0
)
)
*/
//match[0][0] 存放第一个匹配结果
//match[0][1] 存放第二个匹配结果
//match[1][0] 存放第一个匹配结果的第一个字表达式结果
//match[m][n] 存放第n+1个匹配结果的第m字表达式结果
//实例3
$str = "hcl1125113015@163.com";
/*
1. 必须有@
2. @前面是a-z,或者A-Z或者_字符,或者0-9
3. 要求必须是163 或者qq 或者sina
4. 必须有. 后缀是com或者cn
[] 一个字符
+ 代表出现多个,一个以上
^ 必须以它紧跟后面的规则字符 开头
$ 必须以它紧跟前面的规则字符 结束
| (com|cn)出现com或者cn
\. 出现.,如果不转义,.匹配除了\n外的任意字符
*/
$reg = "/^([a-zA-Z0-9_]+)@(163|qq|sina)\.(com|cn)$/i";
if(preg_match($reg, $str, $match) == 1){
echo "是电子邮件";
echo "<pre>";
print_r($match);
}else{
echo "电子邮件非法";
}
/*
$reg = "/^([a-zA-Z0-9_]+)@(163|qq|sina)\.(com|cn)$/i";
是电子邮件
Array
(
[0] => hcl1125113015@163.com
[1] => hcl1125113015
[2] => 163
[3] => com
)
$reg = "/^([a-zA-Z0-9_])+@(163|qq|sina)\.(com|cn)$/i";
是电子邮件
Array
(
[0] => hcl1125113015@163.com
[1] => 5
[2] => 163
[3] => com
)
*/
3.4 正则规则:
/*
元字符--限定符
? 0到1
* 0到多
+ 1到多
{n} 限定出现的次数
{m, n}
元字符--字符匹配:
[a-z]
[^a-z]表示除了字母之外任意一个的字符
\d == [0-9]
\D 与\d相反
\w == [a-zA-Z0-9]
\W 与\w相反
\s 所有空白字符(空格、tab等)
\S 与\s相反
. 匹配除\n之外的所有字符,如果要匹配.就要\.
[.]+ 匹配一个任意字符
.+ 匹配任意多个字符序列,一般不要写成[.]
[\d\D] 就表示所有的任意一个字符
元字符--定位符
\b 匹配目标字符的边界:子串有空格或者字符串的结束位置,
特别注意:没有字符串开始位置
如:"hclsdf sshcl dfasdhcl"
规则是:'/hcl\b/gi';
那么将会匹配后面两个hcl
\B 匹配目标字符串的非边界
规则是:'/hcl\B/gi';
那么将会匹配第一个hcl
元字符--转义符
\ 需要转义的字符有:.*+?^$()[]{}/\
元字符--选择符
|
*/
3.5 正则规范是根本的规范(元字符是通用的),可以用在js\php\asp\jsp\c++\shell等
数据输入时候:应该在客户端(js)验证,然后再在服务端(php)验证,这样才更安全