网站开发日志

2009年8月11日星期二

PHP实用代码系列 - 计算页面加载时间

网页的加载时间很重要,没有人喜欢花好几分钟来等待一个页面加载完毕。影响页面加载速度的因素很多,对于动态网页,其中一个重要因素是代码的效率。不论用那种语言来写网站的人,我们都应该重视代码的效率,注重效率也是优秀程序员和新手的一个重要区别。当你给你的页面加入一些代码的后,最后要检测一下新加入的代码有没有给页面的加载造成很大的影响。下面是一个适用的PHP代码,它可以用来计算页面的加载时间 (更新: 8/12/2009)。

<!-- 把这段反正页面顶部 -->
<?php
   $mtime = explode(" ",microtime());
   $starttime = $mtime[1] + $mtime[0];
?>
 
<!-- 把实际代码放在下面 -->
 
 
<!-- 把这段代码放在页面底部-->
<?php
   $mtime = explode(" ",microtime());
   $endtime = $mtime[1] + $mtime[0];
   $totaltime = ($endtime - $starttime);
   echo "页面加载时间为: ".$totaltime."";
?>

更新:

谢谢扑街囝的回复。我想你指的是

<?php
$start_t = time() + microtime();
//do sth.
$end_t = time() + microtime();
$timer = $end_t - $start_t;
echo $timer;
?>

这确实要精简。其实在PHP5里有更加精简的写法:

<?php
$start_t = microtime(true); //加入true,microtime输出为浮点值
//do sth.
$end_t = microtime(true);
$totaltime = $end_t - $start_t;
echo "页面加载时间为: ".$totaltime."";
?>

标签: ,

2009年7月20日星期一

reCAPTCHA - 帮你帮我

CAPTCHA 是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机和人的公共全自动程序。CAPTCHA目前广泛用于网站的留言板,许多留言板为防止有人利用计算机程式大量在留言板上张贴广告或其他垃圾讯息,因此会放置CAPTCHA要求留言者必需输入图片上所显示的文数字或是算术题才可完成留言。

虽然自己动手写一个简单的CAPTCHA程序也不是很难,但是这里要介绍的如何使用reCATPCHA。reCAPTCHA计划的主要目的是利用CAPTCHA技术来帮助典籍数字化的进行,这个计划将由书本扫描下来无法准确的被光学文字辨识技术识别的文字显示在CAPTCHA 问题中,让人类在回答CAPTCHA问题时用人脑加以识别。为了验证人类所输入的文字是正确的,而不是随意输入,每次有两个字会被显示出来;一个是光学文字辨识软件无法辨别的字,另一个是一个已经知道正确答案的字。如果使用者正确的回答出已知正确答案的字,那么就假设所输入的另一个光学辨识软件无法辨识的字是认真的检视后被输入而非随便输入。因此,每一次有效的验证也是对reCAPTCHA计划的贡献。

(以上文字大部分摘自wiki

要把reCAPTCHA加到你的网站里很简单,reCAPTCHA提供适合于多种程序语言的接口,这里要介绍的reCAPTCHA PHP库的运用。

  • 首先到reCAPTCHA网站上获取API Key,这需要注册,但是是完全免费的。
  • 然后下载reCAPTCHA PHP库
  • 最后调用库函数。下面提供示例,通常这些代码是加在表单(form)里,你需要根据实际情况修改,如有问题请留言。
<?php
require_once('recaptchalib.php');
$publickey = "注册后你将得到这个key"; 
$privatekey = "注册后你将得到这个key";
# the response from reCAPTCHA
$resp = null;
# the error code from reCAPTCHA, if any
$error = null;
$switch = 0;
# are we submitting the page?
if ($_POST["submit"]) {
  $resp = recaptcha_check_answer ($privatekey,
                                  $_SERVER["REMOTE_ADDR"],
                                  $_POST["recaptcha_challenge_field"],
                                  $_POST["recaptcha_response_field"]);
  if ($resp->is_valid) {
	$switch = 1;	
  } else {
  	$switch = 2;
    $error = $resp->error;
  }
}
?>
<form name="validation" enctype="multipart/form-data" action="" method="post">
<!--下面的javascript变量可以控制图片的主题外观,当然这是可选的-->
<script>
var RecaptchaOptions = {
   theme : 'clean',
   tabindex : 2
};
</script>
<?php
if ($switch == 0){
	echo '有空?给reCAPTCHA项目贡献几个字吧:-)';
//你可以把表单内容放在这里
}
elseif ($switch == 2){
	echo '你是机器人?不是的话,请再输一次。';
}
else{
	echo '谢谢你对reCAPTCHA的支持';
//这里加入表单提交成功后的提示信息
}
//下面是重要的recaptcha函数,调用captcha的图片
echo recaptcha_get_html($publickey, $error); 
?>
//这里可以加入其他表单信息
<input type="submit" name="submit" value="submit" />
</form>

下面我用iframe把reCAPTCHA加入这个帖子里,这个表单不传递其它信息,仅供网友测试,同时给reCAPTCHA做点贡献。:-)

reCAPTCHA - 一个帮你帮我的项目,不是吗?

标签: ,

2009年4月19日星期日

PHP实用代码系列 - Ajax密码强度检测

PHP和Ajax搭配真的不是什么新的东西,Google一下,你可以找到很多介绍它们的文章。正是因为它们的流行、简单、强大,所以我觉得在PHP实用代码系列文章里一定不可以少了它们。

在jQuery没出来以前,我都是通过GetXmlHttpObject()函数来实现Ajax。现在好了,jQuery把所有这些繁琐的步骤都包含在它的库文件里,我们只要通过它的接口函数,就可以轻松实现Ajax。在这些接口函数里最简单的应该要算load()。下面我就要开始介绍,PHP+Ajax(通过jQuery的load函数)的小运用 - 密码强度检测

首先是PHP代码(pass_test.php):

<?php
$password = isset($_POST['pass']) ? $_POST['pass'] : "";
if (!$password) echo "";
else{
   $strength = 0;
   // 小写字母
   if(preg_match("/([a-z]+)/", $password)) {
    $strength++;
   }
   // 大写字母
   if(preg_match("/([A-Z]+)/", $password)) {
       $strength++;
   }
   // 数字
   if(preg_match("/([0-9]+)/", $password)) {
       $strength++;
   }
   // 非任意(文字和数字)字母和下滑线的字符
   if(preg_match("/(\W+)/", $password)) {
       $strength++;
   }
   // 密码的长度
   if (strlen($password) < 7) $strength--;
   else $strength++;
   switch($strength) {
       case 0:
       case 1:
           echo '密码强度太弱';
       break;
       case 2:
           echo '密码强度弱';
       break;
       case 3:
           echo '密码强度高';
       break;
       case 4:
       case 5:
           echo '密码强度很高';
       break;
   }
}
?>

上面的PHP代码很简单,它只是通过一些自定义的规则来判断密码的强度。通常认为高强度的密码必须包含大小写字母、数字、和特殊字符,而且密码长度应该不小于6位。

接下来是HTML代码:

<label>请输入密码:</label>
<input id="pass" type="password" name="password" />&nbsp;
<div id="passwd_strength"></div> <!--这个div用来显示提示信息-->

最后是jQuery代码:

<script type="text/javascript" src="/js/jquery.js"></script>
<script type="text/javascript">
   $(document).ready(function(){
      $("#pass").keyup(function(){
         $("#passwd_strength").load("pass_test.php", {"pass" : $(this).val()});
      });
   });
</script>
演示

标签: ,

2009年4月17日星期五

PHP实用代码系列 - 控制CSS

许多网站都提供换肤的功能,这种动态CSS的换肤技术通常是通过Javascript来实现,比如你可以准备两个CSS样式文件(分别定义不同的颜色,背景图等等),当用户点击选择某个样式后,触发自定义Javascript函数来更改CSS。但在这篇文章里,我要介绍的不同的方法,即使用PHP来控制页面的CSS样式。和Javascript的方法相比,这种方法应该算是真正意义上的动态CSS,因为它是用PHP输出CSS样式文件。例如:通过PHP函数,我们可以在一天的不同时段或者某个特别的日子(例如圣诞节),输出不同的CSS样式。

先看看演示,接下来要介绍如何实现这一特效。

首先使用HTML的link标签引用外部CSS样式文件:

<head>
 <link rel="stylesheet" type="text/css" href="style.php" />
</head>

注意: 这里被引用的css文件不是常规的.css文件,而是.php文件。

然后在style.php文件里,根据需要定义一些变量,然后输出css文件:

<?php
header("Content-type: text/css");
$ntime=date("G"); //取得现在的时间(小时)
$ntime += 8; //因为服务器的时间不准,所以这里做了些调整
if($ntime>=0 and $ntime<11){
  $bg = '#ffc';
  $font_color = '#222';
}
elseif ($ntime>=11 and $ntime<14){
  $bg = '#c36';
  $font_color = '#fff';
}
elseif ($ntime>=14 and $ntime<18){
  $bg = '#9cc';
  $font_color = '#555';
}
else{
  $bg = '#333';
  $font_color = '#ffc';
}
?>
body {
 background:<?php echo "$bg" ?>;
 color:<?php echo "$font_color" ?>;
}
a {color:<?php echo "$font_color" ?>;}
a:hover {text-decoration:none;}

上面的PHP代码只是根据不同的时间段,定义背景和字体颜色。在实际运用中,你还可以根据不同的节日来设置CSS的属性变量。总之,你可以根据需要,使用PHP来完全控制CSS。特别注意:在PHP文件的顶部要先送出一个Header:header("Content-type: text/css"); 表明输出的类型为CSS。

代码及演示

标签: ,

2009年4月15日星期三

PHP实用代码系列 - 随机图片

在这个系列里,我将要给大家介绍很多PHP实用代码,这些代码并非很复杂,但是却非常经典实用。希望这些文章可以起到抛砖引玉的作用,并且可以把这些知识运用到你的下一个项目里。

这篇文章要介绍的是如何使用简单的PHP函数来实现随机显示图片。为了让网页更具动态效果,有时你希望用户刷新页面后,可以看到不同的标题图片。用PHP的rand()函数来实现这一特效真的是在简单不过了。

首先准备几张标题图片,把它们命名为:
img_1.jpg, img_2.jpg,img_3.jpg,img_4.jpg,img_5.jpg,img_6.jpg。
当然你还可以使用其它类型的图片,例如:gif。然后,把这些图片上传到某个文件夹,例如:"/images/random"。

接下来使用下面的代码就可以了:

<img src="/images/random/img_<?php echo rand(1,6)?>.jpg" border="0" />
<!-- 注意: "/images/random"保存随机图片的文件夹路径,你应该使用实际路径替换--> 

是不是很简单?

这种方法稍微有点麻烦的地方是你要把图片根据上面的规则重新命名。如果你不想重新命名图片,你还可以使用下面的方法,但是要多写几行PHP代码。 :-)

<?php
$dir = $_SERVER['DOCUMENT_ROOT'] . "images/random";
chdir ($dir);
$images = glob("*.{gif,png,jpg}", GLOB_BRACE);
$file = $images[array_rand($images)];
?>
<img src="<?php echo ("/images/random/$file"); ?>" border="0"  />

注意:

  • 在上面的代码里,我仍然假定图片被存放在文档根目录(document_root)下images文件夹的random文件夹里,即/images/random, 所以你要根据实际情况来改变。
  • 在使用glob函数以前,要先更改路径(chdir)到图片目录。

使用后面这种方法相对要灵活很多,你只需把随机图片上传到图片文件夹即可,无需改名。而且不限图片格式(只要浏览器支持),更强大的是你可以实时更新图片而不用更改代码。

标签: ,