郎创网站建设,网站建设方案免费下载,品牌企划,二道网站建设一、HTTP协议初步认识
HTTP协议概念 HTTP协议#xff0c;即超文本传输协议(Hypertext transfer protocol)。是一种详细规定了浏览器和万维网(WWW World Wide Web)服务器之间互相通信的规则#xff0c;通过因特网传送万维网文档的数据传送协议。 HTTP协议是用于从WWW服务器传…一、HTTP协议初步认识
HTTP协议概念 HTTP协议即超文本传输协议(Hypertext transfer protocol)。是一种详细规定了浏览器和万维网(WWW World Wide Web)服务器之间互相通信的规则通过因特网传送万维网文档的数据传送协议。 HTTP协议是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效使网络传输减少。它不仅保证计算机正确快速地传输超文本文档还确定传输文档中的哪一部分以及哪部分内容首先显示(如文本先于图形)等。 HTTP协议特点 1客户/服务器模式客户端浏览器/服务端 2简单快速客户向服务器请求服务时只需传送请求方法和路径。由于HTTP协议简单使得HTTP服务器的程序规模小因而通信速度很快。 3灵活HTTP允许传输任意类型的数据对象MIME类型 4无连接无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求并收到客户的应答后即断开连接。采用这种方式可以节省传输时间。 5无状态HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息则它必须重传这样可能导致每次连接传送的数据量增大。另一方面在服务器不需要先前信息时它的应答就较快。 HTTP协议分类 1http请求协议浏览器向服务器发起请求的时候需要遵循的协议 2http响应协议服务器向浏览器发起响应的时候需要遵循的协议 HTTP请求 请求行 1形式请求方式 资源路径 协议版本号 2GET /index.php HTTP/1.1
最早的时候HTTP协议有过1.0请求行独占一行第一行 请求头 请求头就是各项协议内容具体的协议内容不会每次都使用全部 1Host请求的主机地址必须 2Accept当前请求能够接收服务器返回的类型MIME类型 3Accept-Language接收的语言 4User-Agent客户浏览器所在点的一些信息
请求头不固定数量每个请求协议也是独占一行最后会有一行空行用来区分请求头和请求体 请求体 请求数据POST请求会有请求体。GET请求所有的数据都是跟在URL之后会在请求行中的资源路径上体现。
基本格式资源名字资源值资源名字资源值…
二、HTTP响应
响应行 1形式协议版本号 状态码 状态消息独占一行 HTTP/1.1 200 ok 2200 ok 成功 3403 Forbidden 没权限访问 4404 Not Found 未找到页面 5500 Server Internal Error 服务器内部错误 响应头 具体协议内容 1时间Wed, 16 Sep 2017 11:43:33 GMT 2服务器Server: Apache/2.2.22 (Win32) PHP/5.3.13 3内容长度Content-Length: 1571数据具体的字节数响应体 4内容类型Content-Type: text/html告诉浏览器对应的数据格式
列举了几个常见的响应头并不是全部响应头一个占一行最后一行空行区分响应头和响应体 响应体 实际服务器响应给浏览器的内容 常用HTTP状态码 状态码200成功 状态码403forbidden拒绝访问没有权限 状态码404NOT FOUND找不到 状态码500服务器问题
服务器正在处理过程中
服务器正常且正确处理
请求的目标已经转移或者需要更新
客户端出错了
服务器出错
HTTP响应 常见HTTP响应设置及使用 PHP中针对HTTP协议响应进行了底层设计可以通过函数header来实现修改HTTP响应响应头
注意事项 1、 Header可以设计HTTP响应因为HTTP协议特点是响应行响应头空行结尾响应体。认为通过header设计响应头的时候不应该有任何内容输出所以一旦产生内容输出哪怕一个空格系统都会认为响应头已经结束而响应体开始了所有如果先输出内容后设置响应头header使用理论设置无效 2、 在PHP5以后增加程序缓存内容允许服务器脚本在输出内容的时候不直接返回浏览器而是现在服务器端使用程序缓存保留php.ini中使用output_buffering有了该内容之后在程序缓存内会自动调整响应头和响应体允许响应头在已经输出的内容之后再设置但是此时会报错警告。 总结header设置响应体之前不要有任何输出
Location重定向立即跳转响应体不用解析 浏览器在解析服务器响应的时候先判定响应行继续响应头最后响应体location是在响应头中所以浏览器一旦见到该协议项不再向下解析。
Refresh重定向定时跳转响应体会解析 延时重定向浏览器会根据具体时间延迟后在访问指定跳转链接浏览器在准备跳转访问之前会继续解析HTTP协议响应头和响应体
Content-type内容类型MIME类型 通过内容告知MIME类型浏览器正确解析内容
Content-disposition内容类型MIME类型扩展激活浏览器文件下载对话框 浏览器在解析内容的时候默认是直接解析那么有时候需要浏览器不解析当做内容下载成文件
PHP模拟HTTP请求 原理 PHP可以通过模拟HTTP协议发起HTTP请求 CURL是一个非常强大的开源库支持很多协议包括HTTP、FTP、TELNET等我们使用它来发送HTTP请求。它给我 们带来的好处是可以通过灵活的选项设置不同的HTTP协议参数并且支持HTTPS。CURL可以根据URL前缀是“HTTP” 还是“HTTPS”自动选择是否加密发送内容。
前提条件HTTP协议的客户端/服务端模式HTTP协议不局限于一定要浏览器访问
Curl扩展库使用 1、 开启CURL扩展
2、 有的时候PHP版本会出现即使开启了扩展也无法使用扩展的可能因为CURL找不到对应的dll文件需要将相关的DLL文件放到C:windows
3、 重启Apache应用
1建立连接curl_init()激活一个CURL连接功能
2设置请求选项curl_setOpt()设定选项 CURLOPT_URL连接对象 CURLOPT_RETURNTRANSFER:将服务器执行的结果响应以文件流的形式返回给请求界面PHP脚本 CURLOPT_POST是否才有POST方式发起请求默认请求是GET CURLOPT_POSTFIELDS用来传递POST提交的数据分为两种方式字符串nameabcpassword123以及数组形式array(‘name’’abc’,…) CURLOPT_HEADER是否得到响应的header信息响应头默认不获取
3执行请求curl_exec()执行选项与服务器发起请求得到服务器返回的内容
乱码原因20select.php中的内容有告知浏览器但是当前是被服务器脚本23curl_http.php访问的没有做解析输出给浏览器之后需要当前23curl_http.php告知浏览器对应的字符集 4关闭连接curl_close()关闭资源
三、文件编程
文件编程初步认识 文件编程的必要性 文件编程指利用PHP代码针对文件文件夹进行增删改查操作。
在实际开发项目中会有很多内容文件上传、配置文件等具有很多不确定性不能在一开始就手动的创建需要根据实际需求和数据本身来进行管理这个时候就可以使用PHP文件编程来实现代码批量控制和其他操作。 文件操作的分类 1 目录操作文件夹用来存放文件的特殊文件 2 文件操作用来存放内容 目录操作 文件操作创建目录结构 1mkDir(路径名字)创建成功返回true创建失败返回false
有些操作为的就是得到一个想要的结果如果结果本身就存在那么可以忽略得到过程的错误抑制错误
删除目录 1rmDir(指定文件夹路径)移出文件夹
读取目录 读取方式将文件夹路径按照资源方式打开
1openDir()打开资源返回一个路径资源包含指定目录下的所有文件文件夹
2readDir()从资源中读取指针所在位置的文件名字然后指针下移直到指针移出资源
读取所有内容遍历操作
关闭目录 1closeDir()关闭资源
其他目录操作 1dirName(一个路径)得到的是路径的上一层路径
2realPath(一个路径)得到真实路径目录路径如果文件不存在那么得到的结果是false
3is_dir()判断指定路径是否是一个目录
4scandir()封装版的opendir\readdir\closedir获取一个指定路径下的所有文件信息以数组形式返回
目录操作 递归遍历目录 递归遍历目录指定一个目录的情况下将其下的所有文件和目录及其目录内部的所有内容都输出出来。
递归算法将大问题切成相似的小问题最小单位然后可以调用解决大问题的方法来解决小问题。 递归函数函数如果自己内部调用自己该函数称之为递归函数。
递归遍历目录的思维逻辑 1、 设计一个能够遍历一层文件的函数 a. 创建函数
b. 安全判定是路径才访问
c. 读取全部内容遍历输出
2、 找到递归点遍历得到的文件是目录应该调用当前函数调用自己 a. 需要构造路径遍历得到的结果只是文件的名字
b. 需要注意排除.和…
c. 判断是路径还是文件
d. 递归调用函数
3、 找到递归出口遍历完这个文件夹之后发现没有任何子文件夹函数不再调用自己自带递归出口 4、 如何显示层级关系函数第一次运行遍历的结果是最外层目录内部调用一次说明进入一个子目录子目录再调用一次函数进行孙子目录…如果能够在第一次调用的时候给个标记然后在进入的时候通过标记的变化来识别层级关系就可以达到目的该标记还能代表层次关系缩进 a. 在函数参数中增加一个标记默认值为0
b. 递归调用函数的时候也需要使用该参数但是是属于当前层级的子层所以1
c. 根据层级来实现缩进str_repeat()
?php// 递归遍历文件夹// 定义路径
$dir uploads;/** 创建函数能够访问指定路径下的所有文件且判断出* 是目录还是文件* param1 string $dir 指定路径* param2 int $level0 ,层级默认顶层* */
function my_scandir($dir,$level0)
{// 保证文件安全如果不是路径没有必要往下执行if (!is_dir($dir)){die($dir . br/);}// 读取全部路径信息遍历输出$files scandir($dir);foreach ($files as $file){// $file就是一个个文件名echo str_repeat(nbsp;nbsp;,$level), $file . br/;// 排除. 和 ..if ($file . || $file ..) continue;// 构造路径$file_dir $dir . / . $file;// 判断路径if (is_dir($file_dir)){// 递归点my_scandir($file_dir,$level 1);}}
}my_scandir($dir);
文件操作 PHP5常见文件操作函数 1file_get_contents(文件路径)获取指定文件的所有内容如果路径不存在最好做安全处理
2file_put_contents(文件路径内容)将指定内容写入到指定文件内如果当前路径下不存在指定的文件函数会自动创建如果路径不存在不会创建路径
PHP4常见文件操作函数 PHP4中是将文件操作用资源形式处理不论是读还是写都依赖资源指针文件内容中指针所在位置。 1fopen(文件路径打开模式)打开一个文件资源限定打开模式
2fread(资源长度)从打开的资源中读取指定长度的内容字节
3fwrite(资源内容)向打开的资源中写入指定的内容
4fclose(资源)关闭资源
其他文件操作函数 1is_file()判断文件是否正确不识别路径 2filesize()获取文件大小 3file_exists()判断文件是否存在识别路径 4unLink()取消文件名字与磁盘地址的连接删除文件 5filemtime()获取文件最后一次修改的时间 6fseek()设定fopen打开的文件的指针位置 7fgetc()一次获取一个字符 8fgets()一次获取一个字符串默认行 9file()读取整个文件类似file_get_contents区别是按行读取返回一个数组 文件操作 文件下载 文件下载从服务器将文件通过HTTP协议传输到浏览器浏览器不解析保存成相应的文件。 提供下载方式可以使用HTML中的a标签点击下载 1、 缺点1a标签能够让浏览器自动下载的内容有限浏览器是发现如果解析不了才会启用下载 2、 缺点2a标签下载的文件存储路径会需要通过href属性写出来这样会暴露服务器存储数据的位置不安全
PHP下载读取文件内容以文件流的形式传递给浏览器在响应头中告知浏览器不要解析激活下载框实现下载。 1指定浏览器解析字符集
2设定响应头 a)设定文件返回类型image/jpg||application/octem-stream b)设定返回文件计算方式Accept-rangesbytes c)设定下载提示Content-disposition:attachment;filename’文件名字’ d)设定文件大小Accept-length文件大小字节
3读取文件 4输出文件 方案1如果文件较小可以使用PHP5的文件函数操作file_get_contents
方案2文件比较大网络不好可以使用PHP4 的文件操作方式一次读一点 ?php// PHP文件下载// 设定解析字符集
header(Content-type:text/html;charsetutf-8);$file 27-file_download.php;// 设定下载响应头
// 以文件流形式传输数据给浏览器
header(Content-type:application/octem-stream);
// 以字节方式计算
header(Accept-ranges:bytes);
// 附件下载指定命名
header(Content-dispositon:attachment;filename . $file);
// 设定文件大小字节
header(Accept-length: . filesize($file));// 注意
// 如果文件的名字是从文件夹读取出来的而且存在中文那么如果直接使用名字作为下载名字会出现乱码
// 出现这种情况需要进行字符集转码
// 从GBK转成UTF-8$file iconv(GBK,utf-8,$file);// 输出文件
// php5: 小文件
//echo file_get_contents($file);// php4:大文件
$f fopen($file, r) or die();
while ($row fread($f,1024))
{echo $row;
}/*while (!feof($f))
{echo fread($f,1024);
}*/// 关闭资源
fclose($f);