PHP 读写Cookie效率分析与性能优化

 更新时间:2016年11月25日 16:24  点击:2166
掌握PHP读写 Cookie的执行时间与效率问题,了解PHP读写Cookie对性能的影响,并在实际开发中合理的使用PHP读写Cookie,分析工具采用PEAR Benchmark_Iterate类,主要关注指标为PHP读写Cookie的程序执行时间。

目录

一,什么是PEAR与Benchmark类
二,为什么要分析PHP读写Cookie情况
三,性能测试代码
四,性能测试结果
五,性能测试总结
六,setcookie函数说明
七,附性能测试源代码下载
参考资料

一,什么是PEAR与Benchmark类

请参考PHP性能优化系列
第二期 PHP性能优化工具篇Benchmark类调试执行时间
第一期 PHP性能优化准备篇图解PEAR安装

二,为什么要分析PHP读写Cookie情况

1,什么是Cookie?
Cookie,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据。

2,PHP与Cookie
PHP通过内置函数setcookie()写cookie,通过$_COOKIE全局变量读cookie,在实际开发中,读写Cookie是与用户交互最主要的方式之一,并且使用也非常频繁,因些需要了解PHP在读写操作Cookie的性能与效率问题。

三,性能测试代码

编写三个函数,分别为写cookie、读cookie和读写cookie,代码如下:

 代码如下 复制代码
<?php
require_once "Benchmark/Iterate.php";
$bench = new Benchmark_Iterate;
function set(){
    setcookie("TestCookie", time(), time()+3600, "/", "", 1);
}
function get(){
    return isset($_COOKIE['TestCookie']) ? $_COOKIE['TestCookie'] : '';
}
function cookie(){
    get();
    set();
}
$bench->run(50,"set");
//$bench->run(50,"get");
//$bench->run(50,"cookie");
$result = $bench->get();
?>

使用Benchmark_Iterate类工具分别调用各个函数50次获取PHP读写Cookie的平均执行时间并生成图表。

四,性能测试结果

1,PHP写Cookie的执行时间

php-set-cookie
图解:使用PHP内置函数setcookie()向客户端发送一个 HTTP cookie,写Cookie的执行时间 0.00072s左右 注s表示秒

2,PHP读Cookie的执行时间
php-get-cookie

图解:使用全局变量$_COOKIE获取客户端cookie值,读Cookie的执行时间 0.00051s左右

3,PHP读写Cookie的执行时间
php-set-get-cookie
先读取cookie值,然后再向客户端发送一个 HTTP cookie,读写Cookie的执行时间 0.00088s左右

五,性能测试总结

通过折线图可以清楚看到,setcookie() 函数向客户端发送一个 HTTP cookie需要的执行时间大约是0.00072s左右,也就是0.7毫秒,PHP读取Cookie的执行时间为0.00051s左右,也就是0.5毫秒,如果同时读写操作Cookie需要的执行时间为0.00088s,也就是0.8毫秒左右,这些操作在秒的时代基本上执行的时间非常短,但请不要小看这个值,正常的PHP内置函数执行的时间大约在0.3毫秒左右,相对而言读写Cookie的执行时间是比较耗时的,因此,在实际开发中要尽量少用这样的函数,充分考虑读写Cookie的情况,特别是写cookie的情况!

毫秒世界还在继续,请关注下一期PHP性能优化系列。

六,setcookie函数说明

setcookie() 函数向客户端发送一个 HTTP cookie。

 代码如下 复制代码

bool setcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]] )

1,cookie 是由服务器发送到浏览器的变量。
2,cookie 通常是服务器嵌入到用户计算机中的小文本文件。每当计算机通过浏览器请求一个页面,就会发送这个 cookie。
3,cookie 的名称指定为相同名称的变量。例如,如果被发送的 cookie 名为 "name",会自动创建名为 $user 的变量,包含 cookie 的值。
4,必须在任何其他输出发送前对 cookie 进行赋值。
5,如果成功,则该函数返回 true,否则返回 false。

文章有二个实例是用来检测上传文件类型与上传图片大小,我本来想分开写但是觉得两个放一起会更好些,有需要的同学看看。
 代码如下 复制代码

 

//-----------------------------------------------------------------------------------


// 函数名:CheckExtendName($C_filename,$A_extend)

// 作 用:上传文件的扩展名判断

// 参 数:$C_filename 上传的文件名

// $A_extend 要求的扩展名

// 返回值:布尔值

// 备 注:无

//-----------------------------------------------------------------------------------

 

 

function CheckExtendName($C_filename,$A_extend)

{

if(strlen(trim($C_filename)) < 5)

{

return 0; //返回0表示没上传图片

}

$lastdot = strrpos($C_filename, "."); //取出.最后出现的位置

$extended = substr($C_filename, $lastdot+1); //取出扩展名

 

 

for($i=0;$i{

if (trim(strtolower($extended)) == trim(strtolower($A_extend[$i]))) //转换大

小写并检测

{

$flag=1; //加成功标志

$i=count($A_extend); //检测到了便停止检测

}

}

 

 

if($flag<>1)

{

for($j=0;$j{

$alarm .= $A_extend[$j]." ";

}

AlertExit('只能上传'.$alarm.'文件!而你上传的是'.$extended.'类型的文件');

return -1; //返回-1表示上传图片的类型不符

}

 

 

return 1; //返回1表示图片的类型符合要求

}

 

 

 

//-----------------------------------------------------------------------------------

 

 

 

// 函数名:CheckImageSize($ImageFileName,$LimitSize)

// 作 用:检验上传图片的大小

// 参 数:$ImageFileName 上传的图片名

// $LimitSize 要求的尺寸

// 返回值:布尔值

// 备 注:无

//-----------------------------------------------------------------------------------

 

 

function CheckImageSize($ImageFileName,$LimitSize)

{

$size=GetImageSize($ImageFileName);

if ($size[0]>$LimitSize[0] ││ $size[1]>$LimitSize[1])

{

AlertExit('图片尺寸过大');

return false;

}

return true;

}

 

 

 

//-----------------------------------------------------------------------------------

 

 

 

// 函数名:Alert($C_alert,$I_goback=0)

// 作 用:非法操作警告

// 参 数:$C_alert(提示的错误信息)

// $I_goback(返回到那一页)

// 返回值:字符串

// 备 注:无

//-----------------------------------------------------------------------------------

 

 

function Alert($C_alert,$I_goback=0)

{

if($I_goback<>0)

{

echo " ";

}

else

{

echo " ";

}

}

?>

文章利用图表来告诉你关于PHP isset()与empty()函数执行时间比较以及性能的好与坏,有需要的朋友可以详细的看看哦。性能测试采用Benchmark_Iterate类工具进行调试,主要关注isset()与empty()函数执行时间。

,测试环境
操作系统:Window XP
PHP版本:PHP Version 5.2.11
Apache版本:Apache 2.0 Handler

二,测试方法
使用Benchmark_Iterate测试isset()和empty在变量存在和不存在的情况下执行50次并生成图表

三,isset()与empty()判断变量不存在的情况
1,测试代码

 代码如下 复制代码

require_once "Benchmark/Iterate.php";
$bench = new Benchmark_Iterate;
function check1($var){
    isset($var);
}
function check2($var){
    !empty($var);
}
$bench->run(50,"check1",$var);
//$bench->run(50,"check2",$var);
$result = $bench->get();


其中$var变量并没有初始化,判断变量不存在的情况,两个函数的执行性能如下图

2,isset()判断变量不存在的情况

php-isset.png

图解:isset()判断变量不存在的情况平均执行时间在0.0010-0.0011秒之间
3,empty()判断变量不存在的情况

php-empty.png
图解:empty()判断变量不存在的情况平均执行时间在0.0010-0.0011秒之间
四,isset()与empty()判断变量存在的情况

,测试代码

 代码如下 复制代码

require_once "Benchmark/Iterate.php";
$bench = new Benchmark_Iterate;
 
function check1($var){
    isset($var);
}
function check2($var){
    !empty($var);
}
$var = true;
$bench->run(50,"check1",$var);
//$bench->run(50,"check2",$var);
$result = $bench->get();

初始化$var变量为true,判断变量存在的情况,两个函数的执行性能如下

2,isset()判断变量存在的情况

php-isset-true.png图解:isset()判断变量存在的情况平均执行时间在0.0010-0.0011秒之间
3,empty()判断变量存在的情况
php-empty-true.png图解:isset()判断变量存在的情况平均执行时间在0.0010-0.0011秒之间
综合上面的测试性能情况,可知isset()和empty()函数的执行时间基本一样,两个函数的平均执行时间在0.0010-0.0011秒之间,当然这与具体的环境有关,从当前测试环境来看,两个函数的性能是一样的。
 
文章利用图文详细的介绍了在php中关于include与include_once和require与require_once性能图,有需要的朋友可以详细的看看,但总体来讲include_once和require_once性能要好很多,特别是在多次调用时。

PHP性能优化第八期函数篇,include()与include_once()和require()与require_once()性能比较,主要是通过获取这四个函数执行时间 比较性能差异,实验采用Benchmark_Iterate类工具。

测试方法
加载一个已经存在的文件exist.php,通过Benchmark_Iterate类调用50次,获取各函数的执行时间并生成曲线图。

测试代码

 代码如下 复制代码

require_once "Benchmark/Iterate.php";
$bench = new Benchmark_Iterate;
function load_include(){
    include 'exist.php';
}
function load_require(){
    require 'exist.php';
}
function load_include_once(){
    include_once 'exist.php';
}
function load_require_once(){
    require_once 'exist.php';
}
$bench->run(50,"load_include");
//$bench->run(50,"load_require");
//$bench->run(50,"load_include_once");
//$bench->run(50,"load_require_once");
$result = $bench->get();

测试结果
1,使用include()函数加载文件的执行时间

php-include.png
图解:使 用include()函数加载文件的平均执行时间为0.0013秒左右

2,使用include_once()函数加载文件的执行时间
php-include_once.png
图解:使用include_once()函数加载文件的平均执行时间为0.0011-0.0012秒

3,使用require函数加载文件的执行时间
php-require.png
图解:使用require()函数加载文件的平均执行时间为0.0012-0.0013秒

4,使用require_once()函数加载文件的执行 时间
php-require_once.png
解:使用require_once()函数加载文件的平均执行时间为0.0011-0.0012秒

由上面测试结果 可知,四个函数加载文件的执行时间基本上差不多,区别在于,如果存在一个文件多次加载的情况,include和require函数会加载多次,而 include_once和require_once函数只会加载一次。同时处理加载失败的情况不同,include() 和include_once() 产生一个警告而 require() 和 require_once() 则导致一个致命错误。

相关说明
include()和require()函数
这两种结构除了在如何处理失败之外完全一样。include() 产生一个警告而 require() 则导致一个致命错误。换句话说,如果想在遇到丢失文件时停止处理页面就用 require()。include() 就不是这样,脚本会继续运行。同时也要确认设置了合适的 include_path。注意在 PHP 4.3.5 之前,包含文件中的语法错误不会导致程序停止,但从此版本之后会。

寻找包含文件的顺序先是在当前工作目录的相对的 include_path 下寻找,然后是当前运行脚本所在目录相对的 include_path 下寻找。例如 include_path 是 .,当前工作目录是 /www/,脚本中要 include 一个 include/a.php 并且在该文件中有一句 include "b.php",则寻找 b.php 的顺序先是 /www/,然后是 /www/include/。如果文件名以 ./ 或者 ../ 开始,则只在当前工作目录相对的 include_path 下寻找。

当一个文件被包含时,其中所包含的代码继承了 include 所在行的变量范围。从该处开始,调用文件在该行处可用的任何变量在被调用的文件中也都可用。不过所有在包含文件中定义的函数和类都具有全局作用域。

include_once() 和require_once()函数
include_once() 和require_once()语句在脚本执行期间包含并运行指定文件。此行为和 include() 和require() 语句类似,唯一区别是如果该文件中的代码已经被包含了,则不会再次包含。如同此语句名字暗示的那样,只会包含一次。 include_once() 和require_once()应该用于在脚本执行期间同一个文件有可能被包含超过一次的情况下,想确保它只被包含一次以避免函数重定义,变量重新赋值等问题。

这是用了phpwind里面的一个字符串截取函数,他支持gbk,gbk2312,utf-8等多种编码的字符截取,也很好高效的支持中文字符串的处理。
 代码如下 复制代码


function substrs($content,$length,$add='Y'){
if (strlen($content)>$length) {
if ($GLOBALS['db_charset']!='utf-8') {
$retstr = '';
for ($i=0;$i<$length-2;$i++) {
$retstr .= ord($content[$i]) > 127 ? $content[$i].$content[++$i] : $content[$i];
}
return $retstr.($add=='Y' ? ' ..' : '');
}
return utf8_trim(substr($content,0,$length)).($add=='Y' ? ' ..' : '');
}
return $content;
}
function utf8_trim($str) {
$hex = '';
$len = strlen($str)-1;
for ($i=$len;$i>=0;$i-=1) {
$ch = ord($str[$i]);
$hex .= " $ch";
if (($ch & 128)==0 || ($ch & 192)==192) {
return substr($str,0,$i);
}
}
return $str.$hex;
}

function cutstr($string, $length, $dot = ' ...') {
global $charset;
if(strlen($string) <= $length) {
return $string;
}
$string = str_replace(array('&', '"', '<', '>'), array('&', '"', '<', '>'), $string);
$strcut = '';
if(strtolower($charset) == 'utf-8') {
$n = $tn = $noc = 0;
while($n < strlen($string)) {
$t = ord($string[$n]);
if($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) {
$tn = 1; $n++; $noc++;
} elseif(194 <= $t && $t <= 223) {
$tn = 2; $n += 2; $noc += 2;
} elseif(224 <= $t && $t <= 239) {
$tn = 3; $n += 3; $noc += 2;
} elseif(240 <= $t && $t <= 247) {
$tn = 4; $n += 4; $noc += 2;
} elseif(248 <= $t && $t <= 251) {
$tn = 5; $n += 5; $noc += 2;
} elseif($t == 252 || $t == 253) {
$tn = 6; $n += 6; $noc += 2;
} else {
$n++;
}
if($noc >= $length) {
break;
}
}
if($noc > $length) {
$n -= $tn;
}
$strcut = substr($string, 0, $n);
} else {
for($i = 0; $i < $length; $i++) {
$strcut .= ord($string[$i]) > 127 ? $string[$i].$string[++$i] : $string[$i];
}
}
$strcut = str_replace(array('&', '"', '<', '>'), array('&', '"', '<', '>'), $strcut);
return $strcut.$dot;
}

[!--infotagslink--]

相关文章

  • phpems SQL注入(cookies)分析研究

    PHPEMS(PHP Exam Management System)在线模拟考试系统基于PHP+Mysql开发,主要用于搭建模拟考试平台,支持多种题型和展现方式,是国内首款支持题冒题和自动评分与教师评分相...2016-11-25
  • JS使用cookie实现DIV提示框只显示一次的方法

    本文实例讲述了JS使用cookie实现DIV提示框只显示一次的方法。分享给大家供大家参考,具体如下:这里运用JavaScript的cookie技术,控制网页上的提示DIV只显示一次,也就是当用户是第一次打开网页的时候才显示,第二次自动隐藏起...2015-11-08
  • Android用MemoryFile文件类读写进行性能优化

    java开发的Android应用,性能一直是一个大问题,,或许是Java语言本身比较消耗内存。本文我们来谈谈Android 性能优化之MemoryFile文件读写。 Android匿名共享内存对外A...2016-09-20
  • PHP中SSO Cookie登录分析和实现

    什么是SSO?单点登录SSO(Single Sign-On)是身份管理中的一部分。SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护...2015-11-08
  • Angular性能优化之第三方组件和懒加载技术

    这篇文章主要介绍了Angular性能优化之第三方组件和懒加载技术,对性能优化感兴趣的同学,可以参考下...2021-05-11
  • PHP中SSO Cookie登录分析和实现

    什么是SSO?单点登录SSO(Single Sign-On)是身份管理中的一部分。SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护...2015-11-08
  • 带你了解PHP7 性能翻倍的关键

    20岁老牌网页程序语言PHP,最快将在10月底释出PHP 7新版,这是十年来的首次大改版,最大特色是在性能上的大突破,能比前一版PHP 5快上一倍,PHP之父Rasmus Lerdorf表示,甚至能比HHVM虚拟机下的PHP程序性能更快。HHVM 是脸书为自...2015-11-24
  • vue项目中js-cookie的使用存储token操作

    这篇文章主要介绍了vue项目中js-cookie的使用存储token操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-14
  • 利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)

    这篇文章主要介绍了利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化),本文给大家介绍的非常想详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-24
  • JavaScript提高网站性能优化的建议(二)

    这篇文章主要介绍了JavaScript提高网站性能优化的建议(二)的相关资料,需要的朋友可以参考下...2016-07-29
  • 提升jQuery的性能需要做好七件事

    这篇文章主要介绍了提升jQuery的性能需要做好的七件事,希望真的帮助大家提升jQuery性能,需要的朋友可以参考下...2016-01-14
  • 什么是cookie?js手动创建和存储cookie

    什么是cookie? cookie 是存储于访问者的计算机中的变量。每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie。你可以使用 JavaScript 来创建和取回 cookie 的值。 有关cookie的例子: 名字 cookie 当访...2014-05-31
  • python爬虫用request库处理cookie的实例讲解

    在本篇内容里小编给大家整理的是一篇关于python爬虫用request库处理cookie的实例讲解内容,有需要的朋友们可以学习参考下。...2021-02-21
  • 基于C#后台调用跨域MVC服务及带Cookie验证的实现

    本篇文章介绍了,基于C#后台调用跨域MVC服务及带Cookie验证的实现。需要的朋友参考下...2020-06-25
  • php测试性能代码

    php测试性能代码 function microtime_float () { list ($usec, $sec) = explode(" ", microtime()); return ((float) $usec + (float) $sec); } functio...2016-11-25
  • css中空路径对页面性能影响的解决方案

    文章介绍了css中空路径对页面性能影响的解决方案,这个可能很多美工朋友不会去注意这一点,下面我们来看看吧。 在写 CSS 的时候,用 background:url(#) 还是会对页面进...2017-07-06
  • 如何用Node.js编写内存效率高的应用程序

    这篇文章主要介绍了如何用Node.js编写内存效率高的应用程序,对Node.js感兴趣的同学,可以参考下...2021-05-01
  • chrome监听cookie变化与赋值问题

    这篇文章主要介绍了chrome监听cookie变化与赋值问题,cookie监听与赋值操作需要manifest文件里声明权限问题,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-10-22
  • jQuery使用cookie与json简单实现购物车功能

    这篇文章主要介绍了jQuery使用cookie与json简单实现购物车功能的方法,介绍了jQuery实现购物车的步骤与关键代码,需要的朋友可以参考下...2016-04-18
  • 详解Document.Cookie

    这篇文章主要介绍了详解Document.Cookie的相关资料,需要的朋友可以参考下...2015-12-27