关于php页面静态化原理与例子
每一个web项目,在日PV量达到十万级或百万级抑或更高时,你的网站响应速度就决定你的项目是能够继续活下去,或立马死掉的关键
除了升级服务器配置,优化代码,优化数据库之外,另一个技术?页面静态化,也是你不得不采用的技术
我们知道,页面在输出之前,会将输出数据暂时存放到BUFFER(缓冲器)中,然后才会输出到页面;所以,BUFFER中的数据,
就是你PHP代码执行,并且模板渲染之后,所生成的静态数据,即html页面;对于数据更新不是很快,或者页面信息实时性要求
不是很高的时候,我们可以将BUFFER的数据写入到一个html文件中,下次访问时,直接请求这个html页面,这样,中间就免去了PHP代码执行时间,
数据库数据查询时间以及模板渲染的时间,对于数据库I/O量大的页面,能很大地提高页面的响应速度
具体实现如下:
*/ /** * 这里是你的PHP逻辑代码 */ //在你页面所有输出内容之前,开启缓冲器 ob_start(); echo ‘hello,word!’ //当使用ob_start()函数之后,页面不会有输出,此时,所有的输出都已经存放在缓存器中 //然后我们将缓存器里面的内容拿出来,存放到一个静态的Html文件中 file_put_contents(‘index.html’,ob_get_contents());//函数ob_get_contents()表示取出当前缓冲器内容; //然后关闭缓冲器并清除缓冲器内容 ob_end_clean(); /*这样,一个静态的html文件就生成了,然后,需要做的只是判断什么时候该生成html文件,什么时候直接访问Html文件 提示:通过filemtime()函数判断Index.html文件的上次修改时间和当前时间间隔,来控制缓存有效期: */ //设置换成有效期为120秒 $cacheTime = ‘120’; if(time()-filemtime(‘index.html’)>$cacheTime){ //不在缓存有效期,重新生成缓存文件 //这里是你的PHP逻辑代码和生成缓存文件的代码 }else{ //在缓存有效期内,直接调用index.html文件 }如果要做到安全密码与用户名都随机我有一个朋友做服务器的登录密码与用户名就是使用了phpmyadmin随机生成密码功能来做的,与其用phpmyadmin不如自己做了,下文整理了一些关于php随机密码生成的自定义函数供大家参考。
可以指定生成的字符串长度
function rand_str($length, $max=FALSE)
{
if (is_int($max) && $max > $length)
{
$length = mt_rand($length, $max);
}
$output = '';
for ($i=0; $i<$length; $i++)
{
$which = mt_rand(0,2);
if ($which === 0)
{
$output .= mt_rand(0,9);
}
elseif ($which === 1)
{
$output .= chr(mt_rand(65,90));
}
else
{
$output .= chr(mt_rand(97,122));
}
}
return $output;
}
调用实例:
$randstr = rand_str(16);
生成随机字符串的函数
<?php
/**
* 产生随机字符串
*
* 产生一个指定长度的随机字符串,并返回给用户
*
* @access public
* @param int $len 产生字符串的位数
* @return string
*/
function randStr($len=6) {
$chars='ABDEFGHJKLMNPQRSTVWXYabdefghijkmnpqrstvwxy23456789#%*'; // characters to build the password from
mt_srand((double)microtime()*1000000*getmypid()); // seed the random number generater (must be done)
$password='';
while(strlen($password)<$len)
$password.=substr($chars,(mt_rand()%strlen($chars)),1);
return $password;
}
?>
创建字符池。
function randomkeys($length)
{
$pattern = '1234567890abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLOMNOPQRSTUVWXYZ,./&l
t;>?;#:@~[]{}-_=+)(*&^%$?!'; //字符池
for($i=0; $i<$length; $i++)
{
$key .= $pattern{mt_rand(0,35)}; //生成php随机数
}
return $key;
}
echo randomkeys(8);
无需创建字符池
function randomkeys($length)
{
$output='';
for ($a = 0; $a < $length; $a++) {
$output .= chr(mt_rand(35, 126)); //生成php随机数
}
return $output;
}
echo randomkeys(8);
随机用户名和随机密码例子
//随机生成用户名(长度6-13)
function create_password($pw_length = 4){
$randpwd = '';
for ($i = 0; $i < $pw_length; $i++){
$randpwd .= chr(mt_rand(33, 126));
}
return $randpwd;
}
function generate_username( $length = 6 ) {
// 密码字符集,可任意添加你需要的字符
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';
$password = '';
for ( $i = 0; $i < $length; $i++ )
{
// 这里提供两种字符获取方式
// 第一种是使用substr 截取$chars中的任意一位字符;
// 第二种是取字符数组$chars 的任意元素
// $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
$password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
}
return $password;
}
//调用
$userId = 'user'.generate_username(6);
$pwd = create_password(9);
mt_srand生成随机种子,密码的长度可以随意定义,最长32位。
<?php
mt_srand((double) microtime() * 1000000);
function gen_random_password($password_length = 32, $generated_password = ""){
$valid_characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$chars_length = strlen($valid_characters) - 1;
for($i = $password_length; $i--; ) {
//$generated_password .= $valid_characters[mt_rand(0, $chars_length)];
$generated_password .= substr($valid_characters, (mt_rand()%(strlen($valid_characters))), 1);
}
return $generated_password;
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>php密码生成器</title>
<style type="text/css">
body {
font-family: Arial;
font-size: 10pt;
}
</style>
</head>
<body>
<span style="font-weight: bold; font-size: 15pt;">密码生成器</span><br /><br />
<?php
if (isset($_GET['password_length'])){
if(preg_match("/([0-9]{1,8})/", $_GET['password_length'])){
print("密码生成成功:<br />
<span style="font-weight: bold">" . gen_random_password($_GET['password_length']) . "</span><br /><br />n");
} else {
print("密码长度不正确!<br /><br />n");
}
}
print <<< end
请为密码生成其指定生成密码的长度:<br /><br />
<form action="{$_SERVER['PHP_SELF']}" method="get">
<input type="text" name="password_length">
<input type="submit" value="生成">
</form>
end;
?>
</body>
</html>
基本思路就是通过一个URL连接,将所有图片的地址抓取下来,然后循环打开图片,利用文件操作函数下载下来,保存到本地,并且
把图片的alt属性也抓取下来,最后将数据保存到自己数据库。
废话不多说,看程序就能明白了,其中,需要用到PHP定时任务和PHP的一个第三方插件simple_html_dom.php,的使用,参考simple_html_dom的下载和使用
代码:
<?php function getLink($url){ include_once('simple_html_dom.php'); $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_HEADER,false); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); $output = curl_exec($ch); curl_close($ch); $html = new simple_html_dom(); $html->load($output); $links = array(); $arr = array(); $title = array(); foreach($html->find('a') as $element){ if( preg_match('#^\/content_[0-9]+_1\.html$#i',$element->href)){ array_push($links,'http://www.111cn.net'.$element->href); array_push($title,$element->title); } } $links = array_values(array_unique($links)); $title = array_values(array_unique($title)); $arr['links'] = $links; $arr['title'] = $title; return $arr; } function loadimg($url,$dirname){ include_once('simple_html_dom.php'); $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_HEADER,false); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); $output = curl_exec($ch); curl_close($ch); $html = new simple_html_dom(); $html->load($output); $arr = array(); foreach($html->find('img[w]') as $element){ $image = $element->src; } $data = file_get_contents($image); $info = getimagesize($image);//获取图片信息,大小,格式 switch($info[2]){ case 1: $str = 'gif'; break; case 2: $str = 'jpg'; break; case 3: $str = 'png'; break; default: continue; break; } if($info[1] < 10 || $info[0] < 10) continue;//图片太小,不是有价值的图片,跳过本次循环 $filename = time().rand(1,999999).'.'.$str; if(!is_dir($dirname)){ mkdir($dirname,0777,true); } $fp = fopen($dirname.$filename,'w'); fwrite($fp,$data); fclose($fp); return $dirname.$filename; } do{ set_time_limit(0); ignore_user_abort(); $img = getLink('http://www.111cn.net /qutu_1.html'); $count = count($img['links']); $arr = array(); for($i=0;$i<$count;$i++){ $arr[]=loadimg($img['links'][$i],'images/'); } $img['url'] = $arr; echo '<br/>'; $img['title']; $res = array(); $len = count($img['title']); //重新将数据组装成我们常用的二维数组,方便数据的数据库处理 for($i=0;$i<$len;$i++){ $res[$i]['title'] = $img['title'][$i]; $res[$i]['url'] = $img['url'][$i]; } foreach($res as $item){ echo '<img src='.$item["url"].'>'.$item["title"].'<br />'; } $interval = 24*3600; sleep($interval); }while(true); ?>抓取就是采集了,今天因为我们要做一个实时采集新浪新闻的功能,下面整理了一个非常了得的php 抓取新浪新闻的程序,我们来看看。
首先,需要下载一个simple_html_dom第三方扩展库,具体下载方式和使用详情可以查看:simple_html_dom的使用.
需要环境支持file_get_contents()函数和curl的支持,具体代码如下:
<?php function timingimg($url,$dirname,$interval){ ignore_user_abort(); //浏览器关闭,程序继续执行 set_time_limit(0);//忽略到默认30秒超时 $interval = empty($interval)?3600:$interval; $dirname = empty($dirname)?'news/':$dirname; if(empty($url)){ die('请输入目标网址!!!'); } do{ $arr = loadimg($url,$dirname); return $arr; //返回抓取内容所保存的路径 sleep($interval); die; }while(true); } /** *获取所有新闻链接 *参数 $url 新闻列表地址 *参数 $dirname 新闻图片保存路径 * 返回 二维数组 所有新闻记录 */ function loadimg($url,$dirname){ set_time_limit(0); include_once('simple_html_dom.php'); $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_HEADER,false); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); $output = curl_exec($ch); curl_close($ch); $html = new simple_html_dom(); $html->load($output); $images = array(); $arr = array(); foreach($html->find('li a') as $element){ if( preg_match('#^http:\/\/tech\.sina\.com\.cn\/it\/[\d]{4}\-[\d]{1,2}\-[\d]{1,2}\/[\d]+\.shtml$#i',$element->href)){ array_push($images,$element->href); } } $images = array_unique($images); sort($images); for($i=0;$i<10;$i++){ //只抓取10条记录 $arr[] = getcontent($images[$i],$dirname); } return $arr; } /** * * * 抓取单个新闻内容 *参数 $url 新闻页面地址 *参数 $dirname 图片保存路径 *返回 一个新闻记录 一维数组 */ function getcontent($url,$dirname){ include_once('simple_html_dom.php'); $html = new simple_html_dom(); $data = file_get_contents($url); $html->load($data); $arr = array(); foreach($html->find('h1#artibodyTitle') as $element){ $arr['title']= @iconv('gbk','utf-8', $element->innertext); ; } $str = ''; foreach($html->find('div#artibody p') as $element){ $str.= $element; } $arr['content'] = $str; foreach($html->find('div.img_wrapper img') as $element){ $arr['alt'] =$element->alt; $data = file_get_contents($element->src); $info = getimagesize($element->src);//get image information switch($info[2]){ case 1: $str = 'gif'; break; case 2: $str = 'jpg'; break; case 3: $str = 'png'; break; default: continue; break; } $filename = time().rand(1,999999).'.'.$str; if(!is_dir($dirname)){ mkdir($dirname,0777,true); } $fp = fopen($dirname.$filename,'w'); fwrite($fp,$data); fclose($fp); $arr['img'] = $dirname.$filename; } return $arr; } ?>
如果大家有更好的建议,欢迎提出来
在手机中使用PHP接口与web对接时我们会做一个加密的值进行握手验证了,下面我们就来为各位介绍一些方法与原理了。方法一,固定一个值,如md5('www.111cn.net') 然后把生成的字符在url或post传递时进行验证
方法二,稍微复杂点双方约定好生成的格式
下面例子www.111cn.net简单讲解PHP接口开发加密技术:
如app要请求用户列表,api是“index.php?module=user&action=list”
app生成token = md5sum (‘user’.’2012-11-28′.’www.111cn.net’.list) = 880fed4ca2aabd20ae9a5dd774711de2;
则实际发起请求为 “index.php?module=user&action=list&token=880fed4ca2aabd20ae9a5dd774711de2”
服务器端接到请求用同样方法计算token:
$module = $_GET['module']; $action = $_GET['action']; $token = md5sum($module.date('Y-m-d',time()).'www.111cn.net'.$action); if($token != $_GET['token']){ alarm('access deny'); exit(); }
这样就判断了请求url参数是合法的,允许访问。关键是接口token参数的构造。
还有一种方法用到cookie,这种情况则不适用于读取接口数据的应用场景,适合在浏览器中访问接口。
1.请求头里带用户username和password,到服务器端做验证,通过才继续下边业务逻辑。
优点:防止了服务器端api被随意调用。
缺点:每次都交互用户名和密码,交互量大,且密码明文传输不安全。
2.第一次请求,要求username和password,验证通过,种cookie到客户端,app保存cookie值。
每次请求带上cookie。
点评:和pc上浏览器认证的原理一样了。
相关文章
PHP传值到不同页面的三种常见方式及php和html之间传值问题
在项目开发中经常见到不同页面之间传值在web工作中,本篇文章给大家列出了三种常见的方式。接触PHP也有几个月了,本文总结一下这段日子中,在编程过程里常用的3种不同页面传值方法,希望可以给大家参考。有什么意见也希望大...2015-11-24- 直接为大家介绍制作过程,希望大家可以喜欢。HTML结构该页面切换特效的HTML结构使用一个<main>元素来作为页面的包裹元素,div.cd-cover-layer用于制作页面切换时的遮罩层,div.cd-loading-bar是进行ajax加载时的loading进...2015-10-30
- 这篇文章主要介绍了解决vue刷新页面以后丢失store的数据问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-12
- 这篇文章主要介绍了解决vuex数据页面刷新后初始化操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-26
- 对于乱码这个问题php开发者几乎都会有碰到过,我们下面主要是介绍了php文件乱码和页面乱码。PHP页面转UTF-8编码问题 1.在代码开始出加入一行: header("Content-Type: text/html;charset=utf-8"); 2.PHP文件编码问题...2015-10-21
- 这篇文章主要介绍了JavaScript 获取滚动条位置并将页面滑动到锚点的的相关资料,帮助大家更好的理解和学习使用JavaScript,感兴趣的朋友可以了解下...2021-02-09
- 这篇文章主要介绍了java后台实现js关闭本页面,父页面指定跳转或刷新操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-16
- 这篇文章主要介绍了vue实现在进行增删改操作后刷新页面,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-05
- 这篇文章主要介绍了Pycharm 跳转回之前所在页面的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-05
- bootstrap布局是应用得很广泛的一种网页布局方法,下面通过本文给大家介绍bootstrap页面缩小变形的快速解决办法,需要的朋友参考下吧...2017-02-08
- 这篇文章主要介绍了微信小程序 注册页面的相关资料,需要的朋友可以参考下...2016-10-20
- 这篇文章主要介绍了 判断页面访问方式电脑或者移动端的相关资料,这里提供了三种方法,需要的朋友可以参考下...2016-10-03
- 这篇文章详细的介绍了C#中的静态,有需要的朋友可以参考一下...2020-06-25
- 这篇文章主要介绍了在vue中实现嵌套页面(iframe),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-31
- C#静态方法与非静态方法的区别不仅仅是概念上的,那么他们有什么具体的区别呢?让我们通过本文向大家介绍下C#中静态方法和非静态方法的区别,一起看看吧...2020-06-25
- 这篇文章主要给大家介绍了关于微信小程序页面间传值的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-09
- 404页面就是一个告诉搜索引擎这个页面不存在了,同时也提示用户可以选择其它的操作了,下面我来给没有apache操作权限朋友介绍php中自定义404页面的操作方法。 方法一...2016-11-25
- 今天在使用西部数码空间时发现里面有很多定义好的伪静态规则了,下面我来给大家介绍一下在后面主机面板中配置使用伪静态功能吧,希望文章对各位会带来帮助。...2016-10-10
- 今天小编就为大家分享一篇关于C#网站生成静态页面的实例讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...2020-06-25
- 这篇文章主要介绍了C#设置页面单位和缩放的方法,涉及C#设置页面属性的相关技巧,需要的朋友可以参考下...2020-06-25