第八回、PHP基础教程,头信息、COOKIS和SESSION的处理

头信息

  头信息一般指HTML中的meta标签,添加所使用的函数是:header(string string)。其中string是所要添加的头信息键值。比较常用的有:

header(“content-type:text/html;

charset=gb2312”);

  相当于<meta http-equiv=”content-type” content=”text/html;

charset=gb2312″/>

header(“refresh:3;

url=http://zjerryj.yculblog.com”);

  相当于<meta http-equiv=”refresh” content=”3;

url=http://www.sqlxedu.cn”/>

header(“location:http://www.baidu.com”);

  这个头信息比较特殊,没有对应的HTML,但是可以用上面的header(“refresh:0;

url=…”)来代替。

另外必须注意的是,header()必须在未输出任何数据前使用,否则将无效。下面的setcookie()、session_start()等都有这种特性。有一种方法是使用输出缓存,将在另外一个章节介绍。

PHP中常用header语句参数举例:

<?php

// ok

header(‘HTTP/1.1 200 OK’);

//设置一个404头:

header(‘HTTP/1.1 404 Not Found’);

//设置地址被永久的重定向

header(‘HTTP/1.1 301 Moved Permanently’);

//转到一个新地址

header(‘location: http://www.baidu.com/’);

//文件延迟转向:

header(‘Refresh:10;

url=http://www.baidu.com’);

print ‘目标网址将在10秒钟后打开’;

//当然,也可以使用html语法实现:<meta http-equiv=”refresh” content=”10;

http://www.baidu.com/” />

// override X-Powered-By: PHP:

header(‘X-Powered-By: PHP/4.4.0’);

header(‘X-Powered-By: Brain/0.6b’);

//文档使用的语言

header(‘Content-language: en’);

//告诉浏览器最后一次修改时间

$time = time()+8*60*60;

// or filemtime($fn), etc

header(‘Last-Modified: ‘.gmdate(‘D, d M Y H:i:s’, $time).’ GMT’);

//告诉浏览器文档内容没有发生改变

header(‘HTTP/1.1 304 Not Modified’);

//设置内容长度

header(‘Content-Length: 1234’);

//设置当前页面内容的类型:

header(‘Content-Type: text/html;

charset=iso-8859-1’);

header(‘Content-Type: text/html;

charset=utf-8’);

header(‘Content-Type: text/plain’);

//纯文本格式

header(‘Content-Type: image/jpeg’);

//JPG图片

header(‘Content-Type: application/octet-stream’);

//rar压缩文件

header(‘Content-Type: application/zip’);

// ZIP文件

header(‘Content-Type: application/pdf’);

// PDF文件

header(‘Content-Type: audio/mpeg’);

// 音频文件

header(‘Content-Type: application/x-shockwave-flash’);

//Flash动画

//设置当前页面为一个下载类型,这样可以隐藏文件的路径

header(‘Content-Type: application/octet-stream’);

header(‘Content-Disposition: attachment;

filename=”文件路径和名称”‘);

header(‘Content-Transfer-Encoding: binary’);

// load the file to send:

// 对当前文档禁用缓存

header(‘Cache-Control: no-cache, no-store, max-age=0, must-revalidate’);

header(‘Expires: Mon, 26 Jul 1997 05:00:00 GMT’);

// Date in the past

header(‘Pragma: no-cache’);

//显示登陆对话框

header(‘HTTP/1.1 401 Unauthorized’);

header(‘WWW-Authenticate: Basic realm=”Top Secret”‘);

print ‘Text that will be displayed if the user hits cancel or ‘;

print ‘enters wrong login data’;

?>

3.2.2 表单

  在预定义变量一节中已经介绍过了$_GET、$_POST和$_REQUEST数组。其中$_GET数组包含通过GET方法传送上来的数据,$_POST则包含用POST方法传送上来的数据,如果你不确定用户是通过哪种方式上传数据或同时使用了这两种方式,那么就可以使用$_REQUEST数组。如:

index.php:

<html>
<head>
<title>GET&

POST&

REQUEST</title>
</head>

<body>

<?php

if(isset($_GET[‘varGET’],$_POST[‘varPOST’]))

{

print “varGET={$_GET[‘varGET’] }<br/>varPOST={$_POST[‘varPOST’] }<br/>”;

print “From $_REQUEST:varGET={$_REQUEST[‘varGET’] } varPOST={$_REQUEST[‘varPOST’] }”;

}

?>

<
form name=”form1″ method=”post” action=”index.php?varGET=php5″>

<input type=”text” name=”varPOST”/>

<input type=”submit” value=”Submit”/>

</form>
</body>
</html>

3.2.3 Cookies

1、读取cookie:使用预定义变量$_COOKIE数组或$_REQUEST数组。

第八回、PHP基础教程,头信息、COOKIS和SESSION的处理

请点击此处输入图片描述

注意:PHP的COOKIES不能当场生效,需要刷新一次。

2、设置cookie:

(1)bool setcookie(string name [,string value [,int expire]])

name和value分别是cookie的名称和值。

expire指定cookie的过期时间,它是一个Unix时间戳,即从Unix纪元开始的秒数,通常用time()函数再加上秒数来设定cookie的失效期。或者用mktime()来实现。如把该值设定为time()+60*60*24的话,则表示该cookie将在1天后失效。如果不设置,那么该cookie将在会话结束(一般是关闭浏览器后)失效。

  另外要注意的是,该函数和header()类似,必须在未输出任何数据前使用,如在PHP开头使用,否则将无效。

<?php

$curTime=time();

setcookie(“lastvisit”,$curTime,$curTime+60);

print “已经设置了cookie:lastvisit=$curTime 该cookie将在1分钟后失效<br/>”;

if(isset($_COOKIE[‘lastvisit’]))

{

print “上次设置的cookie:lastvisit={$_COOKIE[‘lastvisit’] }”;

}

?>

(2)bool setrawcookie(string name [,string value [,int expire]])

setrawcookie()和setcookie()完全相同,只是setrawcookie在向浏览器发送cookie时不会自动进行URL编码。

3.2.4 Sessions

session是基于cookie的,但是仅针对单一客户,且数据经过加密。session的有效期是浏览器关闭前。

在默认设置下,session不会被启用,所以在使用session前必须使用session_start()来启动session。该函数和header()一样,必须在未输出任何数据前使用,一定要将<?session_start()?>放在最前,而且中间不能有空格。访问session时使用的是$_SESSION数组,该数组可读可写,并可直接创建空值。

起动一个session

php通过函数在页面的最前面放置<?session_start()?>来启动一个session。

使用session变量

php通过函数session_register()来注册session变量,如果之前没有调用过session_start()函数,session_register()会先去调用session_start()。需要注意的是,这个函数注册的是变量本身,而不是变量的值,也就是说,在注册了变量var之后,每当它的值改变时,都会将新的值写入文件,而不用显式地再次调用session_register来记档变更。

如果php的配置没有开启register_globals,则只可以用$_SESSION数组来引用session变量,比如var只能这样引用$_SESSION[“var”],而如果开启了register_globals选项,则可以直接用$var。

通过函数session_unregister()可以取消session变量,要注意的是,它只是取消了变量在之后文件中的定义,而它可以在当前文件中持续到文件结尾都有效。

session变量也可以是object,不过当使用object类型的session变量时要注意的是,在每次开启session之前,都要包含该对象的定义,不管这个脚本中使用不使用这个对象。

关闭session

php通过函数session_destroy()来关闭一个session,此时这个session必须是已经开启的,可以通过检查PHPSESSID是否已经设定(它会在http request中设定)来确定是否已经启动了session。

<?php

session_start();

session_unset();

session_destroy();

//释放所有的SESSION变量。

?>

设置session的过期时间:

Int session_cache_expire(参数) 设置session的过期时间,如果没有参数,则返回当前的过期时间;如果给了值则设置session的过期时间(单位分钟)为指定的时间, 默认时间为180分钟。

<?

session_cache_expire(30);

//设置超期时间为30分钟

session_start();

?>

session过期时间设置的一个问题:在本地测试一切正常,可是上传到了虚拟主机之后,不管如何设置,session总是很快就过期。

造成session过期时间不正常的原因是:PHP中的session是以文件的形式存在,如果我们不在程序中指定session文件保存的位置,系统会保存到默认的公用临时文件夹中。这样在本地调试当然是一点问题也没有,可是到了虚拟主机服务器上就不同了。服务器中所有网站都把session文件储存在同一个临时目录中,PHP在清理过期文件时并不区分这些文件来自哪个网站,统统一刀切。所以我们在程序中设定的失效时间也就被系统忽略了。

那么,这时我们可以在要开启session的文件中加入下面的代码,来实现session在虚拟主机上的过期设置。

$lifeTime = 3600;

// 保存一小时

session_set_cookie_params($lifeTime);

$sessionPath = realpath(‘./sessionpath/’);

//此文件建在网站的根目录下,并设置权限为可写(0777)

session_save_path($sessionPath);

session_start();

//开启session

关于SESSION文件被删除的概率问题。为了执行的性能,PHP不会立即把过期的SESSION文件删除,而是有一个概率设置的问题,默认SESSION文件被删除的概率是1/100,所以很多时候会导致SESSION已经过期,但仍然能找到这个SESSION。概率设置需要配置PHP.INI文件,如下:

session.gc_probability = 1;

//把此值改为100,使SESSION文件被删除的概率由1/100变成100/100

session.gc_divisor = 100;

//此语句的下面可以放置设置SESSION过期时间或释放SESSION的语句

虚拟主机用户会不能修改INI文件,则可以使用ini_set(string varname, string newvalue ) 来设定环境配置的参数。使用ini_get(string varname)来获取环境配置的参数。

例如:ini_set(“session.gc_probability”,100);