[PHP]PSR-1/2 育网修订版介绍以及推广

整    理:吴万利

时    间:2015-11-23

说    明:代码规范

关于PSR-1/2

国内靠谱翻译psr-1
国内靠谱翻译psr-2

补充规定

如下的这些都是基于上面规定来的,只是将一些规定明确化

psr-1部分

1 概览

  • 不准使用<\?=短标签

4.2 属性

  • 属性明确规定必须按照"下划线分隔式"
  • 常用变量名
  1. $sql: sql语句
  2. $page: 分页页码
  3. $limit: 每页显示多少条
  4. $ip: 用户ip地址
  5. $dated: 当前时间
  6. $ms: mysqls操作类实例
  7. $pager: 存放分页的html代码
  8. $data: 当前页面主要的数据
  9. $user_id: 用户id
  10. $username: 用户名
  11. $nickname: 用户昵称

psr-2部分

8. [补充]字符串单引号、双引号

  • 纯字符串的时候,使用单引号
  • 字符串中有变量时,使用双引号,变量用{}包含起来。
  1. $show = "你好,{$nickname}!";

9. [补充]用die不用exit

关于CodeSniffer

Github-PHP_CodeSniffer

关于如何操作?

检查我改动的代码

  1. phpcs --standard=PSR2 [files you\'ve changed]

结果展示

  1. FILE: /opt/ci123/www/html/vshop2_dev/svn/lab/src/entity/Product.php
  2. ----------------------------------------------------------------------
  3. FOUND 2 ERRORS AFFECTING 2 LINES
  4. ----------------------------------------------------------------------
  5. 74 | ERROR | Method name "Product::get_discount" is not in camel
  6. | | caps format
  7. 84 | ERROR | Method name "Product::get_photo_url" is not in camel
  8. | | caps format
  9. ----------------------------------------------------------------------

如果没有错误就没有提示

自动修复

  1. phpcbf --standard=PSR1 --standard=PSR2 Slider.php

结果展示

  1. Changing into directory /opt/ci123/www/html/vshop2_dev/svn/lab/src/entity
  2. Processing Slider.php [PHP => 379 tokens in 45 lines]... DONE in 23ms (1 fixable violations)
  3. => Fixing file: 0/1 violations remaining [made 2 passes]... DONE in 49ms
  4. Patched 1 file
  5. Time: 124ms; Memory: 6.75Mb

实际操作步骤说明

【web安全规范】 – 2、基本安全防御


编	写:袁	亮
时	间:2015-10-09
说	明:web安全规范 - 2、基本安全防御

一、外部输入过滤
	1、所有外部参数,必须经过处理过滤
		get参数、post参数($_REQUEST)、cookie数据,$_SERVER中的referer,ua,ip等数据
	2、所有过滤,以服务端验证为准,js客户端验证仅仅是为了增强用户体验
		不允许仅仅是在js加了判断验证,服务端没有
	3、只允许使用过滤后的数据,不允许在后面再使用过滤前的原始参数
		$p = isset($_GET['p'])?intval($_GET['p']):1; //过滤参数
		后面只允许只用$p,不允许出现任何直接调用$_GET['p']的地方
	4、过滤方法
		4.1 整型参数,一律采用intval转换
		4.2 短字符串,采用正则验证,常用正则百度,或者参考统一类库
			比如手机号、用户名、邮箱、邮编等等
		4.3 长字符串,非富文本
			比如个人介绍等,过滤html标签(strip_tags),再加过滤sql注入函数(stripSql)
			如果没有验证完全,或者不确定,可以使用mysql_escape_string()进行转义
		4.4 富文本编辑器的长字符串内容
			htmlspecialchars
			采用统一函数或者类库验证过滤
		4.5 这块详见附件 web安全规范 - 参数过滤
	5、严禁使用register_global、extract函数,php配置中也不允许开启register_global
		也不允许自己写代码,将外部变量全部变成内部变量,很多旧项目中就有
		也不要开启magic_quotes,在需要的时候使用addslashes转义

二、报错信息
	1、错误信息只能显示我们定义的对用户友好的内容,不允许显示与实际错误相关的内容
	2、线上不允许开启报错,包括php.ini和程序中的display_errors
	3、特别要注意,类似mysql_error等,只允许记log,不允许输出到页面
	4、必须要记录日志,这是之后排查的唯一依据
	5、日志不允许web直接访问到
	6、更多报错相关信息,请参考内部博客
		http://blog.geekman.vip/archives/27

三、数据存储
	1、log文件不允许存储在web能访问的地方
	2、cookie记录
		2.1 必须设置httponly属性,防止js读取
		2.2 cookie中不允许存储敏感数据,比如用户密码或者邮箱,手机号等
		2.3 cookie内容必须添加签名,并存储,验证cookie的时候必须比对签名是否正确
	3、数据库存储用户密码
		3.1 不允许存储明文密码
		3.2 必须添加盐值做散列
	4、cookie、session等用户登录凭证,需要设置过期时间,防止被劫持之后,一直有效
	5、注意加密算法和编码、散列的区别
		不要误拿编码做加密(base64、urlencode等等)
		不要使用自己编写的加密算法,采用成熟的高安全性算法
	6、日志文件中,不允许记录密码、银行账号等敏感数据

四、数据签名
	1、签名做法可以参考内部博客
		http://blog.geekman.vip/archives/46
	2、cookie存储需要签名
	3、写接口必须加签名
	4、敏感的读数据接口也必须添加签名验证,比如用户邮寄地址等

五、防暴力破解
	1、用户登录等危险操作必须考虑暴力破解的情况
	2、连续错误次数达到一定次数,则需要一个封禁时间
	3、同一个ip同时对多个账号多次尝试也需要处理
	4、发现有人暴力破解的时候,需要有报警机制,比如邮件、短信等

六、业务逻辑bug
	1、发布的时候,进行了相应的过滤,但是编辑的时候未处理,也会导致bug
	2、修改密码的时候,不进行验证,直接修改
	3、购买商品的时候,价格直接通过参数传递结算
	4、找回密码的时候,通过安全问题来验证,但是安全问题可以在登陆的时候直接修改
	5、这些业务逻辑的bug,需要在需求、开发阶段就要多想想,特别是一些比较危险的操作

七、越权访问
	1、所有后台、管理员操作的地方必须要经过权限验证
	2、所有验证必须是通过服务端验证,不允许采用js隐藏,不显示按钮等来完成
	3、每次都必须验证,不要指望在入口那边验证过了,操作的时候就可以不验证
	4、权限验证,不要寄希望与链接、入口别人不知道,浏览器插件、搜索引擎,都有可能泄露
	5、特别要注意调用接口的地方,不要遗漏
	6、所有操作,都必须想想,这是不是一个所有人都可以任意访问的资源,如果不是,都需要权限验证

八、服务器安全
	1、mysql资源
		1.1 除非特殊申请,否则主库增删改查权限,从库查权限
		1.2 给定权限的时候,必须限制ip,一般是内网固定某台
	2、web服务
		不允许使用root账号启动,比如apache等(我们的云主机上有见过root启动的)
		不要安装不用的扩展,很多扩展是有高危漏洞的
	3、redis、memcache资源
		需要绑定ip,一般是内网
		也可设置加账号密码访问
	4、严禁rm -rf命令,同学的同事有过rm -rf之后,损失一个亿的教训
	5、程序源码被直接显示出来
		解析不当+程序员操作不当,导致.bak文件等直接源码显示出来
	6、.svn文件夹等,直接可以遍历扫描
	7、web访问目录层级,web不允许直接访问到项目代码根目录
		/项目代码根目录/webroot/

九、文件上传
	1、上传文件的存储目录,不允许给执行权限【最重要】
	2、上传图片采用其他域名访问,与web服务域名分开
	3、文件扩展名白名单过滤
	4、存储文件名必须系统生成,不允许用户自定义
	5、想了解更多,可以参考内部博客
		http://blog.geekman.vip/archives/301

十、不要调用系统命令
	1、不要在web服务中调用shell命令,比如exec,system,eval之类的
	2、实在要用,shell命令的参数不要是通过web参数带过来的,否则很容易导致系统被攻破

十一、测试环境
	1、重要项目,必须有搭建测试环境(可以在本地搭建)
	2、测试环境的数据库、memcache等资源也必须是用的测试的
	3、不要把调试后门给上传到了线上,因为不知道哪天调试后门就会被人非法访问了
		不要觉得你这个链接从来没公布出去别人不知道,有个东西叫浏览器插件,还有个东西叫抓包

十二、跳转链接
	1、登陆等callback页面,必须要对callback后的链接进行验证
		否则给用户发了一个育儿网的链接,结果用户登陆之后跳到一个恶意网站,在恶意网站提示用户账户密码错误,请重新输入,然后就会导致用户账户密码被盗
	2、进行有根据用户的referer来进行跳转的,referer中的链接也需要验证,可以随意伪造

http协议基础:内网、外网

编	写:袁	亮
时	间:2015-07-17
说	明:http协议基础:内网、外网

一、前言:
	1、适合于计算机网络基本没学的同学
	2、了解为主
	
二、什么是内网ip,什么是外网ip
	1、广域网(WAN):
		Internet,这是一个世界通用的网络,这边可识别的ip就是我们常说的外网ip
		我们平时上的网络都是这个
		家里连接宽带等,其实就是连接到Internet上
	2、局域网(LAN):
		找了几台计算机,我们互相能识别,那么我们就组成了一个局域网
		我们互相之间能识别,但是其他人并不知道我们是谁是谁
		一般需要通过一台能连接到Internet的设备去上网,比如我们公司的内部网络,对其他人来说,我们公司的这些电脑都是同一个人
	3、为什么需要内网ip
		ipv4的ip地址,只能描述256*256*256*256台独立设备,而现在不够用了,因此需要内网ip
	
三、简单说明
	1、外网地址
		1.1 相当于绝对地址,比如中国,江苏,南京大学
		1.2 跟任何人说这个地址,都是唯一指向同一个
		1.3 外网ip,分3类:
			A类地址:0-127.***.***.***
			B类地址:128-191.***.***.***
			C类地址:192-223.***.***.***
	2、内网地址
		2.1 是一个相当地址,比如说4院3专业2班17号
		2.2 在不同的情况下,代表的是不同的
		2.3 因此不要出现在公司这边,直接连机房那边的局域网地址,完全是牛头不对马嘴
		2.4 内网地址分类,针对外网地址,每一类外网,都有其对应的内网地址格式:
			A类:10.***.***.***
			B类:172.16.***.***
			C类:192.168.***.***
			
四、内网中,也可以再嵌套内网
	1、我们公司,外网地址为:218.94.95.52
	2、内网192.168.0.***
	3、其中某台路由器的内网ip为192.168.0.8
		可以再设置一个内网,192.168.8.***的内网,可以连接256台各设备

五、程序获取ip地址
	function getIp(){//获取IP函数
		$ip = false;
		if(!empty($_SERVER["HTTP_CLIENT_IP"])){
			$ip = $_SERVER["HTTP_CLIENT_IP"];
		}
		if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
			$ips = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
			if ($ip) {
				array_unshift($ips, $ip);
				$ip = FALSE;
			}
			for ($i = 0; $i < count($ips); $i++) {
				if (!preg_match("/^(10|172\.16|192\.168)\./", $ips[$i])) { // 判断是否内网的IP
					$ip = $ips[$i];
					break;
				}
			}
		}
		return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);
	}

winscp的简单使用

编 写:袁 亮
时 间:2015-07-17
说 明:winscp的简单使用

一、简单介绍
1、作用:在本地和远程服务器之间安全地复制文件(所有文件操作基本都支持)
2、Windows下使用

二、配置使用
1、下载软件,没什么好说的
2、配置基本和putty差不多,下个中文版的,看看就会了,如果不会,翻看putty设置
3、传文件等的时候,就是在两边拖拽,看一下就会

三、隧道介绍
1、问题背景
当我们需要向一台不能直接连接的服务器传输文件的时候,就会遇到大问题,连不上,比如内网虚拟机,比如隐藏在跳板机之后的服务器

2、什么是隧道技术
本来是登陆A服务器,但是因为没有权限或者其他原因,导致登陆不上去,但是通过B服务器是可以上A服务器的,而我们本地可以登陆B服务器,因此采用先登陆B服务器,作为隧道,再登陆A服务器

3、设置

图片1 图片2 图片3

4、保存设置,登陆即可

简单MVC框架知识


编	写:袁	亮
时	间:2015-07-13
说	明:简单MVC框架知识

一、框架的优缺点
	1、优点:
		1.1 合作的人越来越多,使用框架,可以更好的划分不同部分,合作更方便
		1.2 有些东西,不需要重复造轮子,直接使用别人做好的框架,比如rewrite、数据库操作、缓存等等
		1.3 接受新项目,可以更快的上手,如果大家都按框架的要求来开发
		1.4 安全性较高,比起裸写程序,很多框架,都对常规安全性问题进行了处理
	2、缺点:
		2.1 除了学习php之外,还需要学习框架的相关知识,更可怕的是大家都没花这个时间去学习,
			导致使用了框架,但都没按框架的规则来写,维护这种项目就是个悲剧
		2.2 因为框架开源,而且太多人使用,因此会出现一些框架本身的漏洞,很容易被人用机器扫描漏洞,造成安全隐患
		2.3 性能比直接写会低一些,不过这个性能差距,可以忽略
			
二、MVC框架是什么?
	1、MVC是为实现代码组织的一种策略,实现框架有很多种,MVC是使用最广的(MTV,MVP,CBD,ORM等)
	2、M:model层,可以理解为是我们的类库,函数库,我们封装的一些工具
	   V:view层,显示层,最终展示给用户看的内容,由这一层决定
	   C:controller层,控制层,决定调用哪些model,进行哪些判断,获取什么数据,加载什么样的显示view显示
	
三、公司常用php框架(都是MVC模式的)
	1、CodeIgniter 电商在用,轻量级,感觉还行
	2、CakePhp 博客后台,ask,圈圈等很多项目在用,轻量级,挺不错的,只是我们很多老项目用错了,必须掌握
	3、ThinkPhp 用的不多
	4、Discuz 快速搭建论坛的首选,城市站等在用
	5、Zend 用户中心,太重了,而且用户中心用的很乱,一般项目,不要选择这个
	6、公司内部框架,博客,圈圈,宝宝主页,试用等一大批项目在用

四、附录:
	1、模板语言smarty(非框架),了解即可,没必要使用
		这个主要就是为了让前端不用学php代码,就可以直接写view层来设计的
		但我个人觉得,学smarty的语法,并不比学php的简单语法更简单,完全没意义
		还增加后端学习smarty语法的成本,并且最终还是要把smarty语法转出php语法的,性能也差
	

php类初阶:简单使用


编	写:袁	亮
时	间:2015-07-13
说	明:php类初阶,简单使用

一、为什么需要使用类?
	1、当项目比较复杂,代码量过大,我们会将两种代码给封装成函数:
		1.1 一种是好多地方重复使用的
		1.2 一种是逻辑比较复杂,不想跟其他代码混在一块
	2、当项目更加庞大的时候,使用函数还是不能很好的组织代码,这个时候,我们会希望通过类来处理
		比如对数据库,可能有10几种操作,每种操作都可以封装成一个函数,但是各个函数又都是针对的数据库做的处理
		这个时候,我们会希望将对数据库的所有操作都封装成一个类,这个类里有各种各样的函数做不同的处理
		这个类本身又有一些公共的变量,可以在这些函数内部使用
		
二、简单范例
	//类定义
	class Mysqls{
		public $_dblink;//类中的公共变量
		
		function __construct(){//构造方法,在类实例化时将自动执行
			$this->_dblink = '';
		}
		//执行一条sql
		function query($sql){
			return mysql_query($sql,$this-_dblink);//使用类中的成员变量
		}
		//从数据库中获取一行数据
		function getRow($sql){
			$query = $this->query($sql);//调用类中的成员函数
			//后续处理
		}
		//从数据库中获取多行数据
		function getRows($sql){
			
		}
	}
	
	$ms = new Mysqls;//实例化一个类,得到一个对象
	$data = $ms->getRow($sql);//调用对象中的成员函数
	var_dump($data);
	die();
	
三、使用
	1、命名规范请点此参考
		类名、函数名、变量名
	2、使用$this来调用成员函数和成员变量
	3、成员变量,以_开头命名
	
四、目标:
	1、能自己写一个简单的类,并使用
	2、理解类、对象、实例化的差异
		类:定义的一类特殊数据结构,一种抽象
		对象:符合一类规则的某个具体数据
		实例化:根据某个类,具体到一个对象的过程,交实例化
	3、一个类,可以实例化多个对象,各个对象之间独立(静态变量例外,后期自己了解),可以自己写代码测试下
		
		
		

curl阶段一:简单使用


编	写:袁	亮
时	间:2015-07-09
说	明:curl的初阶使用

一、curl是干什么的?
	当我们需要在程序中,抓取其他网页或者图片等远程数据的时候,可以使用curl完成一些比较强大的功能
	ps:如果要求不高,只是简单的抓取,可以使用file_get_contents来抓取

二、开启扩展
	ps:确定是否有该扩展,很简单,写个php文件,里面价格curl_init();运行是否报错,如果报错则需要开启扩展
	1、windows下开启,以appserv为例
		1.1 将以下三个文件复制到C:\Windows\system32\下
			AppServ\php5\ext\php_curl.dll
			AppServ\php5\libeay32.dll
			AppServ\php5\ssleay32.dll
		1.2 找到C:\Windows\php.ini文件(phpinfo函数输出的内容中,有php.ini文件的位置)
			extension=php_curl.dll
			将这行前面的;号注释去掉
		1.3 重启apache,appserv中有apache restart的功能
	2、linux
		虚拟机上的话重新编译php的curl模块
		线上服务器,直接找运维同学帮忙安装即可
		
三、简单使用
	1、简单函数
		function curl($url){//curl模拟浏览器方式数据
			$urlinfo = parse_url($url);
			$host = $urlinfo["scheme"].'://'.$urlinfo['host'];

			$ch = curl_init();
			curl_setopt($ch, CURLOPT_URL, $url);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//不直接输出,作为变量返回
			curl_setopt($ch, CURLOPT_REFERER, $host);//模拟referer,防止被禁止,抓取图片的时候非常有用
			curl_setopt($ch, CURLOPT_TIMEOUT,3);//内容传输的最长时间,一定要设置
			curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,3);//连接的最长时间,一定要设置
			$img = curl_exec($ch);
			return $img;
		}
	2、使用
		$html = curl('网页、图片等地址');
	

基本正则表达式能力

编    写:袁    亮
时    间:2015-07-07
说    明:基本正则能力

一、什么是正则表达式?
1、概念:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合
组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑
2、见到的说,就是用一个简单的字符串来匹配一定规则的一类字符串,来达到筛选或者验证字符串是否是我们所需要的字符串格式

二、几个简单例子:
1、匹配用户名:
1.1 代码
[code]
$str = 'yuanliang847';
preg_match('/^[a-z][\w_]{3,19}$/',$str);
[/code]
1.2 正则表达式:/^[a-z][\w_]{3,19}$/
这个正则匹配出来的是:第一个是小写字母,后面有3-19个,小写字母、大写字母、数字或者_组成
后面没有其他字符的字符串
前后的//表示这里面是一个正则表达式
^:表示从字符串最开始匹配
[]:表示只要符合其中一个就满足,a-z代表从小写a到小写的z
\w:代表小写字母或者大写字母或者数字,_这个就代表_本身
{3,19}:代表其前面的内容重复3到19次
$:代表字符串结束,后面不允许跟着其他内容
2、匹配手机号
2.1 表达式
/^1[0-9]{10}$/
2.2 说明:
第一个字符必须是1,后面跟着10位0-9的数字
3、匹配邮寄地址
3.1 表达式
/^[\w]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/
3.2 说明
最开始1到多个大小写字母或者数字
后面可以有0或者多个(.跟着1到多个大小写字母、数字、中划线-)
后面必须有一个@符合
后面有1到多个大小写字母、数字、-组成的字符串
最后必须是以一到多个(.跟着多个大小写字母、数字、-组成)

三、其他
1、正则表达式非常重要,在很多地方都有用到,各语言都支持
2、在实际工作中,变查边学,如果不是经常用到,只需要掌握简单的即可
3、大部分的正则网上都很容易找到,这个阶段,追求能看懂别人写的,并做一些简单的调整即可
4、有兴趣的,可以参考后续的博客,我会慢慢整理

php的输出方法总结

编    写:袁    亮
时    间:2015-07-07
说    明:php的输出方法总结

一、必须掌握
1、echo
1.1 没什么说的,第一个就要学会,网页内容输出都是使用的这个
1.2 缺点:只能输出字符串,不能输出一些复杂的数据结构
2、var_dump
2.1 调试的时候,首选,不管是什么类型的数据,都能打印输出
2.2 调试的时候,经常会跟die连在一块
2.3 需要注意,当数组太大的时候,会被截断,可以通过设置php参数来调整
3、var_export
3.1 类似var_dump,输出的是合法的php代码
3.2 可以补抓输出内容,在适当的地方在重新输出,$str = var_export($data,true);
3.3 输出的内容,可以复制过来,直接作为php数组使用,很多时候做文件缓存会用,很有用
3.4 可以打印调试各种类型数据,而且不会被截断

二、了解
1、print
1.1 类似echo,只能输出字符串
1.2 不怎么使用,了解即可
2、printf
2.1 输出格式化的字符串
2.2 不常用
2.3 类似:sprintf vprintf 等等,有兴趣可以看下

php针对文件、目录的相关知识

编    写:袁    亮
时    间:2015-07-07
说    明:php针对文件、目录的相关知识

一、linux文件权限
linux是一个多用户,多任务的系统,因此所有文件、目录、进程等等,都存在所谓的权限概念
1、3组用户:拥有者、所属组、其他用户(特殊账户:root)
2、基本权限:读权限、写权限、执行权限
3、简单例子,想了解更多请自行了解学习
ll yl.php #shell命令,列出这个文件的信息
-rwxrwxr-x  1 ci123dev apache  1278 6月   9 10:42 yl.php #输出结果
第一个字符:-:代表普通文件,l:代表软连接,d:代表是一个目录(其他b,c等自行了解)
第2-4:代表文件夹游泳者的读写执行权限,rwx代表三种权限都有,如果有-代表对应位置的权限没有
第5-7:代表所属用户组拥有的权限
第8-10:代表其他用户拥有的权限
ci123dev:代表这个文件属于ci123dev这个用户
apache:代表这个文件属于apache这个用户
1278:代表这个文件大小,字节
6月   9 10:42:后面是文件的最后修改时间(想看完整时间,可以加--full-time参数,或者stat查看文件)
4、更改权限或者用户组,具体用户,另查
chmod a+r yl.php
chown ci123dev:apache yl.php

5、注意:windows下的编码是gb2312的,针对文件名、路径等,需要注意编码转化

二、常用文件操作函数
1、一次性读取文件:file_get_contents
1.1 读取文件的首选方法,最简单
1.2 如果文件太大,不能使用该函数,很容易会卡死
1.3 也可以用于读取远程链接的内容,url如果有特殊字符,需要使用urlencode编码
1.4 可以从指定位置,读取限制最大长度的内容
1.5 高阶:
配合strem来修改http头信息,这种情况,直接使用curl会更方便些
// Create a stream
$opts = array(
'http'=>array(
'method'=>"GET",
'header'=>"Accept-language: en\r\n" .
"Cookie: foo=bar\r\n"
)
);
$context = stream_context_create($opts);
// Open the file using the HTTP headers set above
$file = file_get_contents('http://www.example.com/', false, $context);
2、一次性写入文件:file_put_contents
2.1 如果文件不存在,则尝试创建,注意:文件夹不会主动创建,所以必须保证文件存在
2.2 如果文件存在,则覆盖写入,除非设置了追加模式,第三个参数
3.3 写入模式:
FILE_USE_INCLUDE_PATH:在include的目录里搜索,这个一般用不到,除非php配置中设置了include_path
FILE_APPEND:内容追加到文件尾部,不覆盖,日志记录的时候一般都用这个
LOCK_EX:写入的时候,锁定文件,不允许其他人写
3.4 写入内容的格式:string或者一维数组,多维数组或者对象等会写入失败
多维数组可以采用,var_export($data,1);或者json_encode($data);转为字符串写入,推荐var_export
3、将上传上来的文件移动到指定目录
move_uploaded_file与copy,rename不一样,它会检查被移动的文件是否是上传的文件
安全性较高,在做文件上传的时候,只运行以这个来移动
4、针对同一个文件,多次操作;注意:打开的所有句柄,必须关闭
4.1 打开文件句柄,作为后面的操作资源
fopen
模式设置:以什么模式打开,具体参考手册,很重要
4.2 文件读
fread:读取指定长度内容
fgetc:读取一个字符
fgets:读取一行,默认一行最大1K,超出则不读取,可以自己设置
feof:判断是否到了文件结尾
4.3 文件写
fwrite:将内容写入文件中,可以设置最大写入长度
4.4 关闭文件句柄
fclose:关闭句柄
5、文件判断
file_exists:文件或目录是否存在
is_file:判断是否是一个正常文件
6、其他
dirname:去掉最后一层目录或者文件名
ps:配合__FILE__来计算绝对路径,可以查看项目中global.php的写法

三、其他文件函数,了解为主
1、文件判断
is_readable :是否可读
is_writable :是否可写
is_uploaded_file :是否上传上来的文件
2、文件本身操作
filesize:文件大小
rename:剪切文件
copy:复制文件
unlink:删除文件
3、ini文件读取
parse_ini_file
parse_ini_string
4、其他
basename:去除路径,只获取文件名
flock:给文件加锁

四、目录常用函数
1、判断是否文件夹:is_dir
2、创建文件夹:mkdir
3、删除文件夹:rmdir
4、读取文件夹下文件:
4.1 glob:显示符合规则的文件夹下有哪些文件,推荐使用
4.2 readdir 读取由opendir打开的目录
4.3 dir函数配合read使用