PHP文件处理

查看文件名称
besename($path, $suffix) //路径名和文件扩展名

<?php
$path =  '/var/www/web/default.php';
echo  besename($path);
echo '<br>';
echo besename($path,'.php');	//不存在扩展名时,加上.php扩展名
?>

显示目录名称
dirname( p a t h ) r e a l p a t h ( path) realpath( path)realpath(path) //返回绝对路径名

显示文件类型
filetype()函数用于取得文件类型,成功将返回文件的类型,可能的值有fifo、char、dir、block、link、和unknown
显示文件访问与修改时间
取得文件最后的访问时间可以使用:fileatime($filename)

取得文件上次被修改的时间应使用:filemtime( f i l e n a m e ) ∗ ∗ 取 得 文 件 权 限 ∗ ∗ 要 获 取 文 件 或 目 录 的 权 限 : f i l e p e r m s ( filename) **取得文件权限** 要获取文件或目录的权限:fileperms( filename)fileperms(filename)

<?php
echo fileperms('default.php');	//33206
echo '<br>';
//以八进制值返回权限
echo substr(sprintf("%o",fileperms("default.php")),-4);//0666
?>

操作目录
从目录读取文件用到的函数,opendir()(打开文件)、readdir()(读取文件)、closedir()(关闭文件)

<?php
$base_dir = "filelist/";
$fso = opendir($base_dir);
echo $base_dir;
while($flist = readdir($fso)){
	echo $flist;
}
closedir($fso)
?>

创建目录 mkdir( p a t h , path, path,model, r e c u r s i v e , recursive, recursive,context)
$model:规定了目录权限,默认是0777,在Windows下会被忽略
$recursive:规定是否要使用递归模式
$context:指定文件句柄的环境

<?php
mkdir('ShopNc');
//创建多级目录,这里使用$recursive参数
mkdir('a/b/c/d','0777',true);
?>

打开目录
opendir()可以打开目录,若打开成功,返回一个目录流,否则返回false和error信息,可以在命令前面加上@隐藏错误输出。
opendir( p a t h , path, path,context)

<?php
$dir = opendir('dir');
while (($file = readdir($dir))== false){
	echo $file.<br>';
}
closedir($dir);
?>

用DirectoryIterator获取指定目录的文件或者目录
RecursiveDirectoryIterator获取目录下所有文件,包括子目录:
```php
<?php
$oDir = new DirectoryIterator('a');
foreach($oDir as $file){
	$tmpFile['link'] = $file->getPath();
	$tmpFile['name'] = $file->geFileName();
	$tmpFile['type'] = 'file';
	$tmpFile['size' = $file->getSize();
	$tmpFile['mtime'] = $file->getMTime();
	$arrFile[] = $tmpFile;
}
print_r($arrFile);
?>
<?php
$file = new RecursiveIteratorIterator(new RecursiveDirector('dir'));
foreach($oDir as $file){
	$tmpFile['link'] = $file->getPath()$tmpFile['name'] = $file->geFileName();
	$tmpFile['type'] = $file->isFile()?'file':'dir';
	$tmpFile['size' = $file->getSize();
	$tmpFile['mtime'] = $file->getMTime();
	$arrFile[] = $tmpFile;
}
print_r($arrFile);
?>

也可以使用glob函数匹配列出文件名:

<?php
foreach (glob('dir/*.*')as $filename){
echo $filename.<br>;
}
?>

关闭目录:closedir()
读取目录:readdir()
删除目录可以使用rmdir()命令。该目录必须是空目录,并且有相应的权限。该命令执行成功会返回true,失败会返回false

操作文件
打开文件:fopen()

mode说 明
r只读方式打开,将文件指针指向文件头
r+读写方式打开,将文件指针指向文件头
w写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建
w+读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建
a写入方式打开,将文件指针指向文件尾。如果文件不存在则尝试创建
a+读写方式打开,将文件指针指向文件尾。如果文件不存在则尝试创建
x创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则fopen()调用失败并返回false,并生成一条E_WARNING级别的错误信息。如果文件不存在则创建
x+创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,则fopen()调用失败并返回false,并生成一条E_WARNING级别的错误信息。如果文件不存在则创建
b以二进制模式打开文件,如果文件系统能够区别二进制文件和文本文件,可能会使用它。Windows可以区分,Unix则不区分,推荐使用这个选项,便于获得最大程度的执行权限
t文本转换标记,Unix的系统使用“\n”作为行结束符,基于Windows的系统使用“\r\n”作为行结束符,该模式可以透明地将“\n"转换为“\r\n”,该模式只是windowns下的一个选项

关闭文件
bool fclose();

<?php
$file = "demo.txt";
if($fp = fopen($file,"wb")) ===false){
	die("使用写入方式打开".$file."文件失败<br/>");
}else{
	echo  "使用写入方式打开".$file."文件成功<br/>";
}
if(fclose($fp)){
	echo "文件".$file."关闭成功"<br/>";
}else{
	echo "文件".$file."关闭失败<br/>";
}
$file = "http://www.shopnc.net/";
if($fp = fopen($file,"r"))==false){
	die("使用只读方式打开远程文件".$file."失败<br/>");
}else{
	echo "使用只读文件打开远程文件".$file."文件成功<br/>";
}
if(fclose($fp)){
	echo "远程文件".$file."关闭成功<br/>";
else{
	echo "远程文件".$file."关闭失败</br>";
}
?>

读取文件
读取文件的一个字符:string fgetc()

<?php
$file = "demo.txt";
if(($fp = fopen($file,"rb")) === false){
	die("使用只读方式打开".$file."文件失败<br/>");
}else{
	echo "使用只读方式打开".$file."文件成功<br/>";
}
if(($char = fgetc($fp)) === false){
	echo "读取文件".$file."失败<br/>";
}else{
	echo "读取文件".$file."成功,读取内容为:".$char."<br/>";
}
if(fclose ($fp)){
	echo "文件".$file."关闭成功<br/>";
}else{
	echo "文件".$file."关闭失败<br/>";
}
?>

读取文件的一行字符:string fgets()
函数功能为从handle指向的文件中读取一行并返回长度最多为length-1字节的字符串。遇到换行符、EOF或者读取了length-1字节后通知。如果没哟指定参数length,则默认1KB,或者说1024字节。出错时返回false

<?php
$file = "demo.txt";
if(($fp = fopen($file,"r")) ===false){
	die("使用只读方式打开",$file."文件失败<br/>");
}
else{
	echo "使用只读方式打开".$file."文件成功<br/>";
}
echo $file."文件内容如下:"<br/>";
while (!feof($fp)){
	$str =  fgets($fp,100);
	echo $str."<br/>";
}
fclose($fp);
?>

读取任意长度的字符串:fread()函数可以读取文件中的任意长度字符串。
读取整个文件内容:可以使用readlife()、file()、file_get_content()中任意一个函数
readfile():不需要打开/关闭文件,不需要echo、print等输出语句,直接写出文件路径
file(): 不需要打开/关闭文件,file()函数将文件作为一个数组返回。
file_get_contents():不需要打开/关闭文件,file_get_contents()函数将文件字符串返回

<?php
$file = "demo.txt";
readfile($file);
echo "<hr/>";
$farr = file($file);
foreach($farr as $v){
	echo $v."<br/>";
}
echo  "<hr/>";
echo file_get_contents($file);
?>

内部机制不一样,效果一样

写入文件

int fwrite(resource handle,string string [,int length]): 该函数把string的内容写入文件指针handle处。如果指定了length,当写入了length个字节或者写完了string以后,写入就会停止。fwrite()返回写入的字符数,出现错误时则返回false
int file_put_contents(string filename,string data[,int flags[,resource context]])
参数data是要写入的数据,类型可以是string、array或者是stream资源。flags可以是FILE_USE_INCLUDE_PATH\FILE_APPEND和、或LOCK_EX(获得一个独占锁)

<?php
$file = "demo.txt";
$str = "创意有限责任公司";
$fp = fopen($file,"wb") or die("打开文件错误!");
fwrite($fp,$str);
fclose($fp);
readfiile($file);
echo "<hr />";

$str = "http://www.shopnc.net";
file_put_contents($file,$str,FILE_APPEND);
readfile($file);
?>

删除文件:bool unlink();
复制文件:bool copy(string source,string dest)
将文件从source拷贝到dest。

移动文件和重命名文件
bool rename(string oldname,string newname[,resource context])

<?php
$file = "demo.txt";
$newfile = "example.txt";
if(rename($file,$newfile)){
	echo "文件重命名成功!";
}else {
	echo "文件重命名失败!";
}
$movefile = "../demo.txt";
fi(rename($newfile,$movefile)){
	echo "文件移动成功!";
}else{
	echo "文件移动失败";
}
?>

文件上传

文件上传种类

文件类型MIME类型
图片文件image/gif、image/jpg、image/jpeg、image/png、image/x-png
纯文本和HTML文件text/txt、text/plain、text/html
二进制或数据流文件application/octet-stream
音频格式audio/basic
视频格式video/mpeg

表单特性
表单上传时,method属性必须为post,这样才会上传成功
ectype属性必须为 multipart/form-data,它表示上传二进制数据,只有使用了multpart/form-data,才能完整地文件数据,完成上传操作
input标签的type属性为file,这样服务器 才会将input作为上传文件来处理

<html>
<body>
<form action="upload_file.php " method ="post" enctype="multipart/form-data">
	<label for ="file" >Filename:</label>
	<input type="file" name="file" id ="file />
	<br />
	<input type="submit" name ="submit" value="Submit" />
</form>
</body>
</html>

全局变量_FILES

$_FILES全局变量是一个二维数组,它用于接收上传文件的信息,他会保存表单中type值为file的提交信息,有5个列

  • $_FILES[][‘name’]:存放客户端文件系统的文件的名称
  • $_FILES[][‘type’]:存放客户端传递的文件类型
  • $_FILES[][‘size’]:存放文件的字节的大小
  • $_FILES[]['tmp_name]:存放文件别上传后再服务器存储的临时全路径
  • $_FILES[][‘error’]:存放文件上传的错误代码

F I L E S [ ] [ ′ t m p n a m e ′ ] 中 , / t m p 目 录 是 默 认 的 上 传 临 时 文 件 的 存 放 地 点 , 如 果 更 改 这 个 目 录 , 可 以 编 辑 p h p . i n i 中 u p l o a d t m p d i r 的 配 置 。 脚 本 执 行 完 后 临 时 目 录 的 文 件 肯 定 会 被 删 除 。 在 _FILES[][&#x27;tmp_name&#x27;]中,/tmp目录是默认的上传临时文件的存放地点,如果更改这个目录,可以编辑php.ini中upload_tmp_dir的配置。脚本执行完后临时目录的文件肯定会被删除。 在 FILES[][tmpname]/tmpphp.iniuploadtmpdir_FILES[][‘error’]中返回的错误代码是:
UPLOAD_ERR_OK:对应值0.表示没有任何错误
UPLOAD_ERR_INI_SIZE:对应值1.表示上传文件的大小超出了约定值。文件大小的最大值是PHP配置文件中指定的,该指令是upload_max_filesize.
UPLOAD_ERR_FROM_SIZE:对应值2。表示上传文件大小超出了HTML表单隐藏域属性的MAX_FILE_SIZE元素所指定的最大值。
UPLOAD_ERR_PARTIAL:对应值3。表示文件只被上传
UPLOAD_EER_NO_FILE:对应值4。表示没哟上传任何文件

单文件上传

move_uploaded_file()函数,该函数将存放在临时目录下的上传文件拷贝出来,存放到指定目录的指定文件名,如果目标存在,将会被覆盖
move_uploaded_file(需要移动的文件,文件的新位置)

<html>
<meta http-equiv="Content-Type" content="text/html; charset="utf-8" />
<body>
<?php
if(empty($_FILES["file"]["tmp_name"])){
	echo '文件还未上传';
}elseif(!(($_FILES["file"]["type"] == "iamge/gif")||($_FILES["file"]["type"] =="image/jpeg)
|| $_FILES["file"]["type"] == "image/pjpeg"))){
	echo "文件类型不合法";
}elseif($_FILES["file"]["size"] >80000){
	echo "文件大小超过了80k";
}else{
	if($_FILES["files"]["error"] >0){
		echo "返回错误代码:".$_FILES["file"]["error"]."<br />";
	}
	else{
		ehco "文件名称: ".$_FILES["file"]["name"]."<br />";
		echo "文件类型: ".$_FILES["file"]["type"]."<br />";
		echo "文件大小: ".$_FILES["file"]["size"]."<br />";
		echo "临时文件路径:".$_FILES["file"]["tmp_name"]."<br />";

		if(file_exists("upload/".$_FILES["file"]["name"])){
			ehco $_FILES["file"]["name"]."already exists.";
		}else{
			move_uploaded_file($_FILES["file"]["tmp_name"],"upload/".$_FILES["file"]["name"]);
			echo "保存路径:"."upload/".$_FILES["file"]["name"];
		}
	}
}
?>

<form action="upload.php" method="post" enctype="multipart/form-data" >
<input type="file" name="file" />
<input type ="sunmit" name="submit" value="上传" />
</form>
</body>
</html>

==注意 ==:对于IE:识别JPG文件的类型必须是image/jpeg,识别PNG文件的类型必须是image/x-png.对于火狐,识别JPG文件的类型必须是image/jpeg,识别PNG文件的类型必须是image/png
G E T 变 量 是 一 个 数 组 , 内 容 是 由 H T T P G E T 方 法 发 送 的 变 量 名 称 和 值 。 _GET变量是一个数组,内容是由HTTP GET方法发送的变量名称和值。 GETHTTPGET_GET变量用于手机来自method=“get” 的表单中的值。从带有get方法的表单发送的信息对于任何人都是可见的(会显示在浏览器的地址栏),并且对发送的信息量也有限制(最多100字符)

多文件上传

PHP支持多文件同事上传,并将它们的信息自动以数组的形式组织。要完成这项功能,需要在表单中对文件上传域使用与多选框和复选框相同的数组式提交语法。
name属性设置为数组形式,即可实现多文件上传

<html>
<form action = "upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="file[]" />
<input type ="file" name="file[]" />
<input type= "file" name="file[]" />
<input type ="file" name="file[]"/>
<input type="file" name="file[]" />
</form>

接收的$_FILES[“file”]内容如下

Array
(
	[name] =>Array([0] =>pic.jpg  [1] => pic.jpg  [2] =>pic.jpg)
	[type] =>Array([0] =>image/pjpeg  [1] =>image/pjpeg  [2] => image/pjpeg)
	[tmp_name] =>Array([0]=>c:/windows/temp/php46.tmp
	[1]=>C:/windows/temp/php47.tmp  [2]=>C:/windows/temp/hph48.tmp)
	[error]=>Array([0]=>0  [1]=>0  [2]=>0  )
	[size] =>Array([0]=>26303  [1]=>26303  [2]=>26303)\
)

PHP程序处理时,将$_FILES[“file”]的每个元素循环拆分即可

PHP的会话机制

通过session和cookie实现会话处理
session中文翻译为会话,在用户访问网页与服务器断开连接的一个时间段内,session可以跟踪用户的状态,能够存储整个话过程的一些基本信息
cookie是一个文本文件,它位于客户端,这个文件里面存储了会话信息

session是一种会话,它记录会话信息,使得客户端与服务器端的会话得意保持。
在PHP中,session 由一种能够存储用户发出请求信息的方法组成,当用户每次访问网站时,session都会为访问创建一个会话表示,来区分用户的身份,这个表示成为会话ID,这个会话ID就是session的文件名,它具有唯一性和随机性,以确保存储信息的安全,session在客户端的信息是一cookie文件形式存储。若客户端禁用了cookie,客户端存储是不起作用的,为了能让回话得意保持,可以使用uRL的形式来传递会话ID

session是存储在服务器算的会话,相对安全,并且不像cookie那样有存储长度限制,我们可以使用session_set_save_handler函数来自定义session的调用方式
session的创建:bool session_start()

<?php
session_start();	//开启一个新会话
$_SESSION['demo'] ='shopNC';	//在session中存储数据
echo $_SESSION['demo'];	//输出session中存储的数据
?>

session的销毁
尽管与服务器断开或时间过期可自动销毁session会话,但有时产生的session会话文件不会自动销毁,这样就需要手工来销毁这些会话,可以使用session_unset() 或session_destroy()函数
void session_unset(void) //没有返回值。会释放内存中指定的session变量,不完全删除会话,比如他不会清除session文件

bool session_destroy(void)//完全删除当前会话

session 的配置和应用
1. session.save_handler
该指令定义了存储和获取与会话相关的数据的处理器名称,它的参数有以下值:
- files 文件,默认为files
- 社区里特:SQLite数据库
- user:用户自定义的函数
-
2. session.save_path
该指令定义了存储器的参数,如果会话存储器名称为files,则该参数为会话文件的存放路径,session.save_path的默认值为/tmp
session.save_path = “N;/path”
N为会话文件分布的目录深度。当访问量较大时,就会产生大量的I/O操作,这样势必会造成性能下降,并且容易受到攻击。多级目录可以很好缓解

  1. session.name用于设置存储在客户端的会话cookie的名称,默认值为PHPSESSID
  2. session.auto_start:用于设置是否在请求开始时自动开启一个会话,它的值有两种状态:1和0,1表示自动启动一个会话,0表示不自动启动一个会话,需要使用session_start()函数显示启动,默认为0
  3. session.cookie_lifetime 用于设置会话cookie的生命周期,单位为妙,默认值为0,当值为0时,0表示会话cookie的生命周期在浏览器被关闭时就停止
  4. session.cookie_path
    session.cookie_path 用于设置会话cookie在那个路径下有效,默认“/”,当值为“;/”时,表示cookie在当前网站下的所有路径都是有效的,若是其他值,如当值为“/user”,则表示会话只有在网站下的user路径下才是有效的。
  5. session。cookie_domain 用于设置会话cookie的有效作用域,启动该设置可以防止其他的非法域获取自己的回鹘安信息,增强了会话的安全性,该设置默认为空

session的生命周期

如果客户端没有禁用cookie,则cookie在启动session会话的时候扮演的是存储sessionID和session生存期的角色。

<?php
session_start();
//保存一天
$lifeTime = 24 *3600;
setcookie(session_name(),session_id(),time()+$lifeTime, "/";
?>

设置session的生存期:session_set_cookie_params()

<?php
//保存一天
$lifeTime = 24 * 3600;
session_set_cookie_params($lifeTime);
session_start();
?>

使用session控制PHP页面缓存
页面缓存可以减少web应用服务器的流量。但是,相对于动态或敏感内容而言,页面缓存是不安全的。此时可以通过HTTP头(通过header()函数从PHP发送)控制页面缓存。其中cache-control和expires 头是专用头文件,但是他们的使用和功能都有些难以理解。
PHP提供了一个函数,可以控制页面缓存。该函数是session_cache_limiter(),在没有参数的情况下调用它,会指出当前使用的缓存方案:在有参数的情况下,他会将当前输出页面的缓存方案设置为参数对应的值
session_cache_limiter();

常用的值说 明
public表示任何人都可以缓存这个页面及其相关内容,它适合静态内容。如级联样式单文件、相关联的JavaScript文件或图像文件
private表示客户机浏览器可以缓存这个页面中的数据,包括相关联的内容,但其他设备(如代理服务器和网络设备)不应该缓存它,它适合敏感的静态内容
nocache表示其中的任何设备都不应该缓存页面内容(但可能存储相关联的内容,如脚本、样式单和图像)。它适合敏感或动态的内容,并且缓存图像和样式单文件
no-store表示所有设备和计算机不缓存页面或任何相关联的文件
<?php
session_start();
session_cache_limiter('private');
$shile = session_cache_limiter();
echo "默认值是 :$shile<br />n";
?>

session_cache_limiter()函数还能够控制页面在不同的缓存中存储时间的长短(对于允许存储的缓存方案)。这称为缓存过期(cache Expiration),通过该函数在会话中控制。该函数返回缓存过期时间的当前值,单位为min.如果传递参数,可将新的过期时间设置为这个值。
上述这些选项中,session.cache_limiter和session.cache_expire 可以在php.ini中设置完成,不必在每个页面的顶部都设置。

session的安全问题
会话模块不能保证存放在会话中的信息只能被创建该会话的用户看到。根据其存放的数据,还需要采取更多措施来主动保护会话的完整性。
评估会话中携带的数据并实施附加保护措施——这通常要付出代价,降低用户的方便程度。例如,如果要保护用户免于受简单的社交策略侵害,如在URL中显示的会话ID会被别人在电脑屏幕上看到,或被别的网站通过HTTP Referer得到等,则应该启用session.use_only_cookies。此情况下,客户端必须无条件启用cookie,否则会话就不工作。

有几种途径会将现有的会ID泄露给第三方。泄露出的会话ID使第三方能够访问所有与指定ID相关联的资源。第一,URL携带会话ID。如果连接到外部站点,包含有会话ID的URL可能会被存放在外部 站点的Referer 日志中。第二、较主动的攻击者可能会侦听网段的数据包。如果未加密,会话ID会以明文方式在网络中流过。
因此,我们主要解决的思路是通过校验session ID来避免会话ID的泄露

<?php
if(!=isset($_SESSION['user_session'])){
	$_SESSION['user_session'] =
			$_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'];
}
elseif($_SESSION['user_session']
	!=$_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']){
		session_regenerate_id();
}
?>

cookie

cookie是网站为区分不同访问者的身份而存储在客户端上的数据,他是一个文本文件,里面可以包含用户的信息,如省份证号码、密码、购物车内的商品信息等。cookie是具备有效期的,有效期的长短可以根据实际需要灵活设定。
cookie是HTTP Header的一部分,他会通过HTTP header从服务器返回到浏览器上,服务器端在响应中利用Set-Cookie Header来创建一个cookie。因为cookie是存储在客户端机器上的,所以不可避免地带来了一定的安全问题,而且许多浏览器都提供了灵活的控制功能,甚至可能屏蔽cookie,IE8
火狐浏览器中,如果安装了web-developer组件,也可以方便地禁止和启动及查看cookie,甚至可以新增和修改cookie的值,

cookie的工作机制
当客户端初次请求服务器的时候,如果服务器端有设置cookie的语句,则服务器通过随着响应发送一个HTTP的Set-cookie头,在客户机端设置一个cookie文件。
当客户端再次向服务器发送一个HTTP请求时,浏览器会吧本地保存该请求地址的cookie信息发送到服务器,服务器会自动读取,并将其转换成$_COOKIE全局变量方便调用

cookie的创建与销毁
setcookie(name,value,expire,path,domain,secure)
name必需,为cookie的名称
value必需,为cookie的值
expire可选,为cookie的有效期
path可选,为cookie的服务器路径
domain可选,为cookie的域名
secure:可选,规定是否通过安全的HTTPS连接来传输cookie

该函数向客户端发送一个HTTP cookie。
cookie是由服务器发送到浏览器的变量。cookie通常是服务器嵌入到用于计算机中的小文本文件 。每当计算机通过浏览器请求一个页面是,就会发送这个cookie

<?php
//发送一个简单的cookie
setcookie("TestCookie","ShopNC");
?>
<html>
<body>
...
//发送一个24小时以后过期的cookie
setcookie("TestCookie", $value, time()+3600*24;
//通过把失效提起设置为过去的日期、时间,删除一个cookie
setcookie("TestCookie","",time()-3600);

setcookie函数与header()函数一样,也是作为响应头header的一部分发送的,所以在调用该函数之前 ,不能有任何输出,如果脚本中包含空行或空白字符(不属于PHP代码块),我们会看到类似如下的警告信息:

要解决上面的问题,可以将php.ini中的配置项output_buffering 设置为on,或者我们可以用ob_start()函数现将内容输出到缓冲区例,然后在用ob_end_flush或flush输出缓冲区的内容
我们在本地创建一个session.php测试文件,放在网站的根目录下,代码如下:

<?php
//cookie演示实力
setcookie('company','ShopNC');
?>

然后访问http://localhost/cookie.php ,他会向服务器发送如下表头信息

服务器会将如下表头信息返回给客户端浏览器:

返回值为200,表示响应成功。我们看到有一行Set-Cookie:companyShopNC,他表示服务器端PHP执行时创建了cookie值并作为响应头的一部分一起发送给客户端。
然后,当我们再次从客户端访问http://localhost/cookie.php时,他会想服务器发送如下表头信息
这里我们可以发现,第一次访问时相比,多了一行数据cookie:company=shopNC,这说明当我们访问服务器端时,相对应的存放在客户端的有效cookie会随标头信息一起发送给服务器:
因为cookie是随标头一起发送的,所以当我们设置cookie后,它在本业是不会生效的,我们需要在另一个页面来访问其值,比如可以使用print_r($_COOKIE)来查看cookie的值。
关于cookie的删除,如果为cookie指定了过期时间,cookie会在过期时间以后自动销毁,但有时用户希望能手动删除cookie,删除cookie非常简单,只需要创建一个同名cookie,将其他设置为空即可。如下

<?php setcookie("TestCookie",''); ?>

当然我们可以为cookie设置一个新值,他的过期日期是在过去,这样客户机意识到这个cookie已经过期,会让程序把它清理掉
setcookie(“TestCookie”,"",time()-3600)
PHP中怎样获取cookie
在PHP服务器端,利用$_COOKIE数组可以获取浏览器cookie数据
下面这段代码讲述了PHP中cookie的使用:

<?php
// 设定cookie 
setcookie("cookie['three']","cookiethree",time()+3600);
setcookie("cookie['two']","cookietwo",time()+3600);
setcookie("cookie['one']","cookieone",time()+3600);
//读取cookie
if(isset($_COOKIE['cookie'])){
	ehco $_COOKIE['COOKIE']['\"two\"']."<br />;
	foreach($_COOKIE['cookie'] as $name=>$value){
		echo "$name :$value<br />\n";
	}
}

注意定义cookie变量的时候,中括号的变量名是不加引号的
运行结果如下:
‘three’:cookiethree
‘two’:cookietwo
‘one’:cookieone

使用session和cookie时应注意的问题

cookie是保存在客户端计算机中的,对于未设置过期时间的cookie,cookie值会保存在计算机的内存中,只要关闭浏览器,则cookie会自动消失。如果设置了cookie的过期时间,name浏览器会把cookie以文本文件的形式保存到硬盘中,当再次打开浏览器时,cookie值依然有效。
session是把用户需要存储的信息保存在服务器端。每个用户的session信息就像是键值对一样存储在服务器端,其中的键sessionid,而值就是用户需要存储的信息。服务器端就是通过sessionid来区分存储的session信息是哪个用户
两者最大的区别就是session存储在服务器端,而cookie存储在客户端。session安全性更高,而cookie安全性弱
使用cookie时,一定要注意浏览器是否支持cookie,浏览器的安全级别不宜过高,否则会屏蔽cookie。
使用cookie是,在没有打开缓冲区的情况下,调用setcookie函数之前不能 哟任何输出,哪怕是空行也不可以,否则会出现类似“warning:cannot modify header information-headers already sent by …”的警告信息
虽然会话能够用来帮助用户在web应用程序的各个部分之间的导航,当其中常常包括一些敏感的信息,如银行账户、积分、余额、操作记录等重要信息,所以会话很容易成为攻击的目标,所以我们会话时,一定注意一下两点:

  • 一定要开启session.use_only_cookies,如果开启,PHP会拒绝基本URL的会话ID,
  • 在会话数据中放置一个标识变量,来区分是合法的还是伪造的。
  • 我们可以调用session_regenerate_id()函数,分配一个新的会话ID,示例如下:
 <?php
session_start();
if(!=isset($_SESSION['is_create'])){
	session_regenerate_id();
	$_SESSION['is_create'] =TRUE;
}
?>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值