php测试代码执行消耗的内存和时间
我们先来看看microtime 和 memory_get_usage函数用法吧
义和用法
microtime() 函数返回当前 Unix 时间戳和微秒数。
语法
microtime(get_as_float)参数 描述
get_as_float 如果给出了 get_as_float 参数并且其值等价于 TRUE,该函数将返回一个浮点数。
例子
代码如下 | 复制代码 |
<?php echo(microtime()); ?> |
输出:
0.25139300 1138197510
一,函数原型
int memory_get_usage ([ bool $real_usage=false ] )
二,版本兼容
PHP 4 >= 4.3.2,PHP 5
三,基础用法与实例
1,获取当前的内存消耗量
代码如下 | 复制代码 |
<?php |
结果输出:62328 122504 62416
说明:memory_get_usage() 函数输出的数值为 bytes 单位
2,格式化 memory_get_usage() 结果以 KB 为单位输出
代码如下 | 复制代码 |
<?php function convert($size){ $unit=array('b','kb','mb','gb','tb','pb'); return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i]; } echo convert(memory_get_usage(true)); ?> |
265KB
好了两个函数基本介绍完了,下面我来看一个测试实例
代码如下 | 复制代码 |
<?php $t1 = microtime(true); /*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/ /*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/ $t2 = microtime(true); echo '<hr >'; /** if ($byte < 1024) { } else if ($byte < 1024*1024) { if ($string) { return $ret; |
Cache-Control
Cache-Control 是最重要的规则。这个字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令。这些指令指定用于阻止缓存对请求或响应造成不利干扰的行为。这些指令通常覆盖默认缓存算法。缓存指令是单向的,即请求中存在一个指令并不意味着响应中将存在同一个指令。
cache-control 定义是:Cache-Control = “Cache-Control” “:” cache-directive。表 1 展示了适用的值。
Cache-directive | 说明 |
---|---|
public | 所有内容都将被缓存 |
private | 内容只缓存到私有缓存中 |
no-cache | 所有内容都不会被缓存 |
no-store | 所有内容都不会被缓存到缓存或 Internet 临时文件中 |
must-revalidation/proxy-revalidation | 如果缓存的内容失效,请求必须发送到服务器/代理以进行重新验证 |
max-age=xxx (xxx is numeric) | 缓存的内容将在 xxx 秒后失效, 这个选项只在HTTP 1.1可用, 并如果和Last-Modified一起使用时, 优先级较高 |
在客户端通过浏览器发出第一次请求某一个URL时,根据 HTTP 协议的规定,浏览器会向服务器传送报头(Http Request Header),服务器端响应同时记录相关属性标记(Http Reponse Header),服务器端的返回状态会是200,格式类似如下:
代码如下 | 复制代码 |
HTTP/1.1 200 OK |
客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送报头(Http Request Header),服务器端响应并记录相关记录属性标记文件没有发生改动,服务器端返回304,直接从缓存中读取:
代码如下 | 复制代码 |
HTTP/1.x 304 Not Modified |
一、Last-Modified、Expires和Etag相关工作原理
1、Last-Modified
在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记(Http Reponse Header)此文件在服务期端最后被修改的时间,格式类似这样:
1 Last-Modified: Tue, 24 Feb 2009 08:01:04 GMT
客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头(Http Request Header),询问该时间之后文件是否有被修改过:
1 If-Modified-Since: Tue, 24 Feb 2009 08:01:04 GMT
如 果服务器端的资源没有变化,则自动返回 HTTP 304 (Not Changed.)状态码,内容为空,这样就节省了传输数据量。当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回和第一次请求时类似。从而 保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。
注:如果If-Modified-Since的时间比服务器当前时间(当前的请求时间request_time)还晚,会认为是个非法请求
2、Etag工作原理
HTTP 协议规格说明定义ETag为“被请求变量的实体标记” (参见14.19)。
简单点即服务器响应时给请求URL标记,并在HTTP响应头中将其传送到客户端,类似服务器端返回的格式:
1 Etag: “5d8c72a5edda8d6a:3239″
客户端的查询更新格式是这样的:
1 If-None-Match: “5d8c72a5edda8d6a:3239″
如果ETag没改变,则返回状态304。
即:在客户端发出请求后,Http Reponse Header中包含 Etag: “5d8c72a5edda8d6a:3239″
标识,等于告诉Client端,你拿到的这个的资源有表示ID:5d8c72a5edda8d6a:3239。
当下次需要发Request索要同一个URI的时候,浏览器同时发出一个If-None-Match报头( Http Request Header)此时包头中信息包含上次访问得到的Etag: “5d8c72a5edda8d6a:3239″标识。
1 If-None-Match: “5d8c72a5edda8d6a:3239″
这样,Client端等于Cache了两份,服务器端就会比对2者的etag。如果If-None-Match为False,不返回200,返回304 (Not Modified) Response。
3、Expires
给出的日期/时间后,被响应认为是过时。如Expires: Thu, 02 Apr 2009 05:14:08 GMT
需和Last-Modified结合使用。用于控制请求文件的有效时间,当请求数据在有效期内时客户端浏览器从缓存请求数据而不是服务器端. 当缓存中数据失效或过期,才决定从服务器更新数据。
4、Last-Modified和Expires
Last-Modified标识能够节省一点带宽,但是还是逃不掉发一个HTTP请求出去,而且要和Expires一起用。而Expires标识却使得浏 览器干脆连HTTP请求都不用发,比如当用户F5或者点击Refresh按钮的时候就算对于有Expires的URI,一样也会发一个HTTP请求出去, 所以,Last-Modified还是要用的,而 且要和Expires一起用。
5、Etag和Expires
如果服务器端同时设置了Etag和Expires时,Etag原理同样,即与Last-Modified/Etag对应的Http Request Header:If-Modified-Since和If-None-Match。我们可以看到这两个Header的值和Web Server发出的Last-Modified,Etag值完全一样;在完全匹配If-Modified-Since和If-None-Match即检查 完修改时间和Etag之后,服务器才能返回304.
6、Last-Modified和Etag
Last-Modified 和ETags请求的http报头一起使用,服务器首先产生 Last-Modified/Etag标记,服务器可在稍后使用它来判断页面是否已经被修改,来决定文件是否继续缓存
过程如下:
1. 客户端请求一个页面(A)。
2. 服务器返回页面A,并在给A加上一个Last-Modified/ETag。
3. 客户端展现该页面,并将页面连同Last-Modified/ETag一起缓存。
4. 客户再次请求页面A,并将上次请求时服务器返回的Last-Modified/ETag一起传递给服务器。
5. 服务器检查该Last-Modified或ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304和一个空的响应体。
注:
1、Last-Modified和Etag头都是由Web Server发出的Http Reponse Header,Web Server应该同时支持这两种头。
2、Web Server发送完Last-Modified/Etag头给客户端后,客户端会缓存这些头;
3、客户端再次发起相同页面的请求时,将分别发送与Last-Modified/Etag对应的Http Request Header:If-Modified-Since和If-None-Match。我们可以看到这两个Header的值和Web Server发出的Last-Modified,Etag值完全一样;
4、通过上述值到服务器端检查,判断文件是否继续缓存;
二、对于非实时交互动态页面中Epires和Etag处理
对数据更新并不频繁、如tag分类归档等等,可以考虑对其cache。简单点就是在非实时交互的动态程序中输出expires和etag标识,让其缓存。 但需要注意关闭session,防止http response时http header包含session id标识;
3.1、Expires
如expires.php
代码如下 | 复制代码 |
header(’Cache-Control: max-age=86400,must-revalidate’); |
3.2、Etag
根据Http返回状态来处理。当返回304直接从缓存中读取
如etag.php
代码如下 | 复制代码 |
cache(); |
图片缓存实例
代码如下 | 复制代码 |
|
上面的方法超级简单,下面看个完整实例
代码如下 | 复制代码 |
$fullpath = '/www/images/' . basename($_GET['img']); //假定文件都在/www/images/下 |
生成短网址程序
代码如下 | 复制代码 |
<?php |
这样生成职来的就是如 htt:/z.cn/abcfc 这种了,但是我们要实现能访问就需要在你apache或iis配置一个伪静态了,如下
代码如下 | 复制代码 |
如何将 http://z.cn/link.php?url=http://www.111cn.net 缩成 http://z.cn/zHEYrvV |
这个地方需要用到url重写,按照本例则可以这么重写:
代码如下 | 复制代码 |
RewriteEngine On RewriteBase / RewriteRule ^/(.*)$ link.php?url=$1[L] |
php删除特定数组值
首先
代码如下 | 复制代码 |
var_dump($context['linktree']); |
得到
代码如下 | 复制代码 |
array(3) { [0]=> array(2) { ["url"]=> string(52) “http://127.0.0.1/testforum.cityofsteam.com/index.php” ["name"]=> string(28) “City of Steam Official Forum” } [1]=> array(2) { ["url"]=> string(55) “http://127.0.0.1/testforum.cityofsteam.com/index.php#c1″ ["name"]=> string(28) “City of Steam Official Forum” } [2]=> array(2) { ["url"]=> string(62) “http://127.0.0.1/testforum.cityofsteam.com/index.php?board=4.0″ ["name"]=> string(12) “Announcement” } } |
我要去掉中间那个。
用:unset($context['linktree']['1']);
结果:
代码如下 | 复制代码 |
array(2) { |
就少了一个[1]
让这中间的1自动编号:
代码如下 | 复制代码 |
|
但是这种方法的最大缺点是没有重建数组索引,就是说,数组的第三个元素没了。
经过查资料后,原来PHP提供了这个功能,只不过很间接。这个函数是array_splice()。
为了使用方便,我封装成了一个函数,方便大家使用:
代码如下 | 复制代码 |
<?php function array_remove(&$arr, $offset) { } $arr = array('apple','banana','cat','dog'); ?> |
经过测试可以知道,2的位置这个元素被真正的删除了,并且重新建立了索引。
程序运行结果:
代码如下 | 复制代码 |
Array ( [0] => apple [1] => banana [2] => dog ) |
php判断 数组中的数值
有专门的函数,不要用for循环,系统函数能实现快速搜索:
in_array
(PHP 4, PHP 5)
in_array — 检查数组中是否存在某个值
说明
bool in_array ( mixed $needle, array $haystack [, bool $strict] )
在 haystack 中搜索 needle,如果找到则返回 TRUE,否则返回 FALSE。
如果第三个参数 strict 的值为 TRUE 则 in_array() 函数还会检查 needle 的类型是否和 haystack 中的相同。
注意: 如果 needle 是字符串,则比较是区分大小写的。
注意: 在 PHP 版本 4.2.0 之前,needle 不允许是一个数组。
例 292. in_array() 例子
代码如下 | 复制代码 |
<?php $os = array("Mac", "NT", "Irix", "Linux"); if (in_array("Irix", $os)) { echo "Got Irix"; } if (in_array("mac", $os)) { echo "Got mac"; } ?> |
第二个条件失败,因为 in_array() 是区分大小写的,所以以上程序显示为:
Got Irix
例 293. in_array() 严格类型检查例子
代码如下 | 复制代码 |
<?php if (in_array('12.4', $a, true)) { 1.13 found with strict check |
例 294. in_array() 中用数组作为 needle
代码如下 | 复制代码 |
<?php if (in_array(array('p', 'h'), $a)) { 'ph' was found |
向一个数组中加入数值
我们可以通过函数来实现,将一个或多个元素插入到数组中去,也可以直接添加进去。
(1)向数组中直接添加数据,新元素的下标是从原数组下标最大值之后开始的。
(2)array_unshift()函数在数组的开头添加一个或多个元素。
语法如下:
int array_unshift ( array &array, mixed var [,mixed ...]) ;
array_unshift()将传入的元素插入到array数组的开头。元素是作为整体被插入的,传入元素将保持同样的顺序。所有的数值键名将从0开始重新计数,文字键名保持不变。
(3)array_push()函数将一个或多个单元添加到数组的末尾。
语法:
int array_push ( array &array, mixed var [, mixed ...]) ;
array_push()将array当成一个栈,并将传入的变量添加到array的末尾。该函数返回数组新的单元总数。向数组中添加数据的示例如下。
示例:
代码如下 | 复制代码 |
<?php $shili = array (“1″,”2″,”3″,”4″) ; $shili[]=5 ; //直接添加数据 print_r ( $shili ) ; echo “<br>” ; $shili2 = array (“m”,”n”) ; array_unshift ($shili2,”o”,”p”) ; //添加元素于数组的开头 print_r ( $shili2 ) ; echo “<br>” ; $shili3 = array (“Php”) ; array_push ($shili3, “MySQL”,”Apache”) ; //添加元素于数组的末尾 print_r ($shili3) ; ?> 结果为: Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) Array ( [0] => o [1] => p [2] => m [3] => n ) Array ( [0] => Php [1] => MySQL [2] => Apache ) |
最简单的办法就是直接使用php $_SERVER['HTTP_REFERER']
如果我在A.php页面要登录
现在跳到B.php页面,我们只要在b.php中加如下代码
代码如下 | 复制代码 |
$url = $_SERVER['HTTP_REFERER']; |
但是上面的办法会有很多不足,如带参数等等,但在IE浏览器下的话,假如你是通过js的location来跳转的话,那这个值是获取不到的。
下面我做一个全面点的。
首先创建一个方法判断是否登录,如果没登录则
代码如下 | 复制代码 |
protected function checkLogin() { |
然后在需要登录的才能反问的页面调用这个方法:
代码如下 | 复制代码 |
$this->checkLogin(); |
这样如果你没有登录则跳转到登录页面。并带上了你之前页面的url:
然后获取URL提交登录:
代码如下 | 复制代码 |
public function login() { |
模板上获取到url后提交到php后台,登录后跳转到这个url ok搞定
相关文章
- 这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
- 这篇文章主要介绍了教你怎么用Java获取国家法定节假日,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-23
- 这篇文章主要介绍了解决@SpringBootTest 单元测试遇到的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-14
mysql中获取一天、一周、一月时间数据的各种sql语句写法
创建表:复制代码 代码如下:create table if not exists t( id int, addTime datetime default '0000-00-00 00:00:00′)添加两条初始数据:insert t values(1, '2012-07-12 21:00:00′);insert t values(2, '2012-07...2014-05-31- 这篇文章主要介绍了.NET/C# 使用Stopwatch测量运行时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 这篇文章主要介绍了浅谈redis key值内存消耗以及性能影响,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-07
- 这篇文章主要介绍了详解分析MySQL8.0的内存消耗,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下...2021-03-23
- DVWA (Dam Vulnerable Web Application)DVWA是用PHP+Mysql编写的一套用于常规WEB漏洞教学和检测的WEB脆弱性测试程序。包含了SQL注入、XSS、盲注等常见的一些安全漏洞...2016-11-25
- mail()函数的作用:连接到邮件服务器,利用smtp协议,与该服务器交互并投邮件。注意:1、mail函数不支持esmtp协议,---即,只能直投,不能登陆2、由上条,我们只能直投至最终的收件服务器地址.而该地址,又是在PHP.ini中指定的,所...2015-10-30
- 宿主机使用网线的时候,客户机在Bridged Adapter模式下,使用Atheros AR8131 PCI-E Gigabit Ethernet Controller上网没问题。 宿主机使用无线的时候,客户机在Bridged Adapter模式下,使用可选项里唯一一个WIFI选项,Microsoft Virtual Wifi Miniport Adapter也无法上网,故弃之。...2013-09-19
- 常用的日期时间正则表达式 下面收藏了大量的日期时间正则匹配函数,包括分钟,时间与秒都能达到。 正则表达式 (?n:^(?=d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(...2016-11-25
- 实例讲解之前,先来介绍几个核心函数: mktime 函数 mktime() 函数返回一个日期的 Unix 时间戳。 参数总是表示 GMT 日期,因此 is_dst 对结果没有影响。 参数可以从右到左依次空着,空着的参数会被设为相应的当前 GMT 值。...2015-11-08
- 想在网页中动态地显示当前系统的时间,找了好多,不过都是一些停在那里不动的。。。不过皇天不负有心人,终于让我找到了...2020-06-25
- 这篇文章主要介绍了postgresql 中的时间处理小技巧(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-29
- 这篇文章主要介绍了解决使用OpenCV中的imread()内存报错问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
- 我打开android开发手册的时候:http://www.csdn123.com/html/android/reference/packages.html 发现打开速度很慢,我用按了一下F12打开调试面板,切换到网络的选项卡network...2016-05-19
- 这篇文章主要介绍了C# 当前系统时间获取及时间格式详解的相关资料,这里提供代码实例,帮助大家学习参考,需要的朋友可以参考下...2020-06-25
- /*解决代码高亮太长不换行*/ .syntaxhighlighter{word-break:break-all;} uParse('#newstext', {rootPath: '/e/extend/ueditor/'}) 帝国CMS显示指定时间内更新的信息数...2016-11-01
- 这篇文章主要给大家介绍了关于C#使用TimeSpan时间计算的相关资料,以及通过一个实例代码给大家介绍了C#使用timespan和timer完成一个简单的倒计时器的方法,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧...2020-06-25
- 这篇文章主要介绍了JavaScript时间操作之级联日期选择操作,涉及到年、月、日、星期,感兴趣的小伙伴们可以参考一下...2016-01-18