这篇是针对以前php知识的补充内容php
处理文件夹的基本思想以下:
1.读取某个路径的时候判断是不是文件夹
2.是文件夹的话,打开指定文件夹,返回文件目录的资源变量
3.使用readdir读取一次目录中的文件,目录指针向后偏移一次
4.使用readdir读取到最后,没有可读的文件返回false
5.关闭文件目录html
咱们来学习一比经常使用函数:linux
函数名 | 功能 |
---|---|
opendir | 打开文件夹,返回操做资源 |
readdir | 读取文件夹资源 |
is_dir | 判断是不是文件夹 |
closedir | 关闭文件夹操做资源 |
filetype | 显示是文件夹仍是文件,文件显示file,文件夹显示dir |
<?php //设置打开的目录是D盘 $dir = "d:/"; //判断是不是文件夹,是文件夹 if (is_dir($dir)) { if ($dh = opendir($dir)) { //读取到最后返回false,中止循环 while (($file = readdir($dh)) !== false) { echo "文件名为: $file : 文件的类型是: " . filetype($dir . $file) . "<br />"; } closedir($dh); } } ?>
chmod 主要是修改文件的的权限web
<?php //修改linux 系统/var/wwwroot/某文件权限为755 chmod("/var/wwwroot/index.html", 755); chmod("/var/wwwroot/index.html", "u+rwx,go+rx"); chmod("/somedir/somefile", 0755); ?>
咱们常常会遇处处理文件路径的状况。
例如:
1.文件后缀须要取出来
2.路径须要取出名字不取目录
3.只须要取出路径名中的目录路径
4.或者把网址中的各个部份进行解析取得独立值
5.甚至是本身组成一个url出来
... ....数据库
不少地方都须要用路径处理类的函数。windows
咱们把经常使用的路径处理函数为你们作了标注,你们对着这个路径处理函数进行处理便可:数组
函数名 | 功能 |
---|---|
pathinfo | 返回文件的各个组成部份 |
basename | 返回文件名 |
dirname | 文件目录部份 |
parse_url | 网址拆解成各部份 |
http_build_query | 生成url 中的query字符串 |
http_build_url | 生成一个url |
<?php $path_parts = pathinfo('d:/www/index.inc.php'); echo '文件目录名:'.$path_parts['dirname']."<br />"; echo '文件全名:'.$path_parts['basename']."<br />"; echo '文件扩展名:'.$path_parts['extension']."<br />"; echo '不包含扩展的文件名:'.$path_parts['filename']."<br />"; ?>
咱们来看一下文件结构:
index.php ---展现输入框和留言内容
write.php ---向message.txt写入数据
message.txt ---存入聊天内容
index.php文件浏览器
<?Php //设置时区 date_default_timezone_set('PRC'); //读了内容 @$string = file_get_contents('message.txt'); //若是$string 不为空的时候执行,也就是message.txt中有留言数据 if (!empty($string)) { //每一段留言有一个分格符,可是最后多出了一个&^。所以,咱们要将&^删掉 $string = rtrim($string, '&^'); //以&^切成数组 $arr = explode('&^', $string); //将留言内容读取 foreach ($arr as $value) { //将用户名和内容分开 list($username, $content, $time) = explode('$#', $value); echo '用户名为<font color="gree">' . $username . '</font>内容为<font color="red">' . $content . '</font>时间为' . date('Y-m-d H:i:s', $time); echo '<hr />'; } } ?> <h1>基于文件的留言本演示</h1> <form action="write.php" method="post"> 用户名:<input type="text" name="username" /><br /> 留言内容:<textarea name="content"></textarea><br /> <input type="submit" value="提交" /> </form>
看了刚刚的展现内容,咱们知道文件存储时:
1.段与段之间进行了分割
2.内容与用户以前用一个特殊的符号进行了分割缓存
下面咱们来写write.php写入留言至文件的代码:服务器
<?php //追加方式打开文件 $fp=fopen('message.txt','a'); //设置时间 $time=time(); //获得用户名 $username=trim($_POST['username']); //获得内容 $content=trim($_POST['content']); //组合写入的字符串:内容和用户之间分开,使用$# //行与行之间分开,使用&^ $string=$username.'$#'.$content.'$#'.$time.'&^'; //写入文件 fwrite($fp,$string); //关闭文件 fclose($fp); header('location:index.php'); ?>
在咱们平常使用中常常会遇到不少种这样的状况:
QQ空间里面上传图片呀
微信朋友圈上传图片
发邮件里面上传邮件资料附件
认证的时候要求上传照片或身份证
文件上传须要注意php.ini文件
配置项 | 功能说明 |
---|---|
file_uploads | on为 开启文件上传功能,off为关闭 |
post_max_size | 系统容许的POST传参的最大值 |
upload_max_filesize | 系统容许的上传文件的最大值 |
memory_limit | 内存使用限制 |
建议尺寸: file_size(文件大小) < upload_max_filesize < post_max_size < memory_limit
另外,须要注意的是脚本执行时间。
max_execution_time,这什参数的单位为秒。
这个参数是设定脚本的最大执行时间。
也能够根据需求作适当的改变。一般不须要来修改,系统默认值便可。超大文件上传的时候,可能会涉及到这一项参数的修改。
上传时间太长了,会超时。若是你将此项参数设为0,则是不限制超时时间,不建议使。
完成了php.ini的相关配置,咱们就能够开始试着完成第一次文件上传了。
系统返回的错误码详解
错误码 | 说明 |
---|---|
0 | 无误,能够继续进行文件上传的后续操做。 |
1 | 超出上传文件的最大限制,upload_max_filesize = 2M php.ini中设置,通常默认为2M。可根据项目中的实际须要来修改 |
2 | 超出了指定的文件大小,根据项目的业务需求指定上传文件的大小限制 |
3 | 只有部分文件被上传 |
4 | 文件没有被上传 |
6 | 找不到临时文件夹,可能目录不存在或没权限 |
7 | 文件写入失败,可能磁盘满了或没有权限 |
注:错误码中没有5。
在开发上传功能时。咱们做为开发人员,除了php.ini中规定的上传的最大值外。 咱们一般还会设定一个值,是业务规定的上传大小限制。
例如:
新浪微博或者QQ空间只准单张头像图片2M。而在上传图册的时候又能够超过2M来上传。
因此说,它的系统是支持更大文件上传的。
此处的判断文件大小,咱们用于限制实际业务中咱们想要规定的上传的文件大小。
在网络世界里面也有坏人。他们会把图片插入病毒,在附件中上传病毒,他们会在网页中插入病毒或者黄色图片。
咱们须要对于上传的文件后缀和mime类型都要进行判断才能够。
MIME(Multipurpose Internet Mail Extensions)是多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
在判断后缀和MIME类型的时候,咱们会用到PHP的一个函数in_array(),该函数传入两个参数。
第一个参数是要判断的值;
第二个参数是范围数组。
咱们用这个函数来判断文件的后缀名和mime类型是否在容许的范围内。
咱们的文件上传成功了,不会让它保存原名。由于,有些人在原名中有敏感关键词会违反我国的相关法律和法规。咱们能够采用date()、mt_rand()或者unique()生成随机的文件名。
文件上传成功时,系统会将上传的临时文件上传到系统的临时目录中。产生一个临时文件。同时会产生临时文件名。咱们须要作的事情是将临时文件移动到系统的指定目录中。
而移动前不能瞎移动,或者移动错了都是不科学的。移动前咱们须要使用相关函数判断上传的文件是否是临时文件。
is_uploaded_file()传入一个参数($_FILES中的缓存文件名),判断传入的名称是否是上传文件。
临时文件是真实的临时文件,咱们须要将其移动到咱们的网站目录下面了。
让咱们网站目录的数据,其余人能够访问到。
咱们使用:move_uploaded_file()。
这个函数是将上传文件移动到指定位置,并命名。
传入两个参数:
第一个参数是指定移动的上传文件;
第二个参数是指定的文件夹和名称拼接的字符串。
**代码以下:
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题文档</title> </head> <body> <h1>上传文件</h1> <form action="chuli.php" method="post" enctype="multipart/form-data"> 请选择文件:<input type="file" name="file" /><input type="submit" value="上传" /> </form> </body> </html>
注意事项:
1.form 表单中的参数method 必须为post。若为get是没法进行文件上传的
2.enctype须为multipart/form-data
<?php //取文件信息 $arr = $_FILES["file"]; //var_dump($arr); //加限制条件 //1.文件类型 //2.文件大小 //3.保存的文件名不重复 if(($arr["type"]=="image/jpeg" || $arr["type"]=="image/png" ) && $arr["size"]<10241000 ) { //临时文件的路径 $arr["tmp_name"]; //上传的文件存放的位置 //避免文件重复: //1.加时间戳.time()加用户名.$uid或者加.date('YmdHis') //2.相似网盘,使用文件夹来防止重复 $filename = "./images/".date('YmdHis').$arr["name"]; //保存以前判断该文件是否存在 if(file_exists($filename)) { echo "该文件已存在"; } else { //中文名的文件出现问题,因此须要转换编码格式 $filename = iconv("UTF-8","gb2312",$filename); //移动临时文件到上传的文件存放的位置(核心代码) //括号里:1.临时文件的路径, 2.存放的路径 move_uploaded_file($arr["tmp_name"],$filename); echo "文件上传成功"; } } else { echo "上传的文件大小或类型不符"; } ?>
在php.ini配置文件中。咱们能够控制php的错误显示状态。php.ini中有一个专门的配置项:
display_errors
这个选项设置是否将错误信息输出到网页,或者对用户隐藏而不显示。
这个值的状态为on 或者 off,也能够设值为1 或者0。
display_error的值设为0或者off则不在页面中显示错误,若是设为1或者on则显示错误信息。
问题:若是没有修改服务器php.ini的状态权限怎么办? 可使用ini_set。
<?php ini_set('display_errors' , 0 ); ?>
上面的代码也至关于修改了php.ini中display_errors的值。不过,仅仅在当前php代码中生效。
问题:想取得php.ini的配置项状态怎么办?
可使用ini_get(参数项) 获得参数的值。
<?php echo '服务器中display_errors的状态为' . ini_get('display_errors'); ?>
注:修改完php.ini文件,须要重启服务器
【掌握级别的错误类型】 咱们将最经常使用的错误分为了三种:
错误类型 | 说明 |
---|---|
E_ERROR | 错误,文件直接中断 |
E_WARNING | 警告,问题比较严重。可是还会继续向下运行 |
E_NOTICE | 提示,有些小问题不会影响到程序。常发生在项目未定义 |
E_PARSE | 编译时语法解析错误。解析错误仅仅由分析器产生。 |
E_ALL | 全部的错误 |
E_STRICT | 启用PHP对代码的修改建议,以确保代码具备最佳的互操做性和向前兼容性。 |
E_DEPRECATED | 启用后将会对在将来版本中可能没法正常工做的代码给出警告。 |
在上面的几种类型中:
error最严重,必需要解决。否则程序没法继续向下执行
warning也很重要。通也必需要解决。若是明确的,故意的能够不用处理。
notice 你能够不用管。可是在有些公司,项目标准特别高。在高标准要求的项目中也必需要解决。由于,notice会影响到PHP的执行效率。一般发生在函数未定义等。
parse错误,是指语法错写错了,必需要解决,表明所有类型的全部错误。
一、 在php.ini中error_reporting参数。如若error_reporting参数设置为0。整个PHP引擎发错误均不会显示、输出、记录。在下一章将要讲到的日志记录中,也不会记录。
若是咱们想显示全部错误能够写上:
error_reporting = E_ALL
想要显示全部错误但排除提示,能够将这个参数写为:
error_reporting = E_ALL & ~ E_NOTICE
显示全部错误,但排除提示、兼容性和将来兼容性。可写为:
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
二、在有些状况下咱们无权限操做php.ini文件,又想要控制error_reporting怎么办呢?
在运行的xxxx.php文件中开始处,咱们可使用error_reporting()函数达到目标。
<?php //关闭了全部的错误显示 error_reporting(0); //显示全部错误 //error_reporting(E_ALL); //显示全部错误,但不显示提示 //error_reporting(E_ALL & ~ E_NOTICE); ?>
在一些公司里面,有专门的日志收集系统。日志收集系统会在背后默默的帮你收集错误、警告、提示。也有些公司没有专门的日志收集系统,经过文件来服务器当中的运行日志。
其中:PHP的错误,警告这些是必需要收信的。那么问题来了——不让用户看到,设置好错误报告级别好,如何将错误收集到日志系统中呢?
这里有须要使用到php.ini的相关配置项。这两个配置项为:
参数 | 配置项 | 说明 |
---|---|---|
log_errors | on/off | 是否开启日志记录 |
log_errors_max_len | 整型,默认1024 | 单行错误最大记录长度 |
error_log | syslog或者指定路径 | 错误日志记录在什么地方 |
说明:
1.在表格中的log_errors和log_errors_max_len很是好理解。
2.而error_log 指定将错误存在什么路径上。配置项中的syslog可能有点不太好理解。syslog是指系统来记录。windows系统在电脑的日志收集器里面。linux默认在: /etc/syslog.conf
[扩展] 了解知识点。若Linux系统启动或修改了日志收集。可能存储在第三方专用的日志收集服务器中。
此外,PHP还为咱们专门准备了一个自定义的错误日志函数:
bool error_log ( string $错误消息 [, int $错误消息类型 = 0 [, string $存储目标]] )
这个函数能够把错误信息发送到web服务器的错误日志,或者到一个文件里。
经常使用的错误消息类型
错误消息类型 | 说明 |
---|---|
0 | 发送至默认的error_log指定位置 |
1 | 发送到指定的邮件位置 |
3 | 发送至指定的文件位置 |
<?php //没法链接到数据库服务器,直接记录到php.ini 中的error_log指定位置 error_log("没法链接到数据库服务器服务器"); //能够发送邮件,可是php.ini必须配置过邮件系统 error_log('能够用邮件报告错误,让运维人员半夜起床干活',1 ,'pig@php.cn'); //记录在指定的位置 error_log("我是一个错误哟", 3, "d:/test/my-errors.log"); ?>
以上就是今天要讲的内容,本文仅仅简单对以前PHP知识的一些补充,后面可能会用到。