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使用

清除session时的一个小bug

编    写:袁    亮
时    间:2014-09-23
说    明:清除session时的一个小bug

1、清除所有session,不能使用unset($_SESSION);
单个session可以通过unset来删除,比如unset($_SESSION['GOODS']);
session的过程是在php执行session_start的时候,先查看cookie中是否有相应的sessionid
如果有,则将对应session名中的值,取出来,反序列化,变成一个php全局变量$_SESSION
执行过程中,session变量可以随意改变
脚本结束后,将session变量序列化,然后回写到对应sessionid中(这个时候,如果没有相应全局变量应该不会回写,从而导致该问题)

2、session常见优化:
开启session之后,访问量稍微大点,web服务器的IO压力就会急剧上升,因为默认是通过文件形式来做session的读写
一个简单的优化办法就是将session的存储方式改成Memcache形式,将php.ini中所有的session设置去除,加一下三行即可
[Session]
session.save_handler = memcache
session.save_path=tcp://192.168.0.106:11216

session相关知识总结文档

编    写:袁    亮
时    间:2015-01-15
说    明:session相关知识总结文档

一、说明
1、session是存储当前用户的一些信息
2、数据存储在服务器的文件中
3、session管理一个客户端(用户),一般通过cookie的形式
4、session可以让一个用户的数据在不同的页面之间互通

二、生存周期
1、服务端通过session_start开启session功能
前面不能有输出(因为这一步需要设置一个http头,设置cookie用)
2、初始化数据信息
判断之前有没有session的对应cookie(默认叫PHPSESSID)
如果有,则找到对应的文件,将文件内容读取,反序列化成php数组$_SESSION
如果没有,则$_SESSION为空
3、在脚本中,添加、删除、更改session数组的内容,即时生效
4、脚本运行结束,php进程将$_SESSION数组的内容,序列化,并重新写入到服务器对应文件中
如果整个$_SESSION被unset注销掉,会导致php进程跳过该操作,从而使得修改过的session没有保存,从而出错
5、session过期
PHPSESSID是一个会话形式的cookie,在浏览器关闭的时候就失效,从而使得session文件不再由对应的客户端用户
服务端会定时对session文件进行销毁,一般是24分钟(默认值1440秒)
session销毁是以概率形式的,这个概率在php配置中设置

三、SESSION存储方式
1、默认是使用cookie来和客户端进行对应关系,但也设置通过get形式来传递(不建议)
2、从上述周期看,每一次使用session都会涉及到文件的读写,在QPS较高的情况下,IO影响很大
可以在php中配置,使用memcache作为session存储的载体,从而把io降下来
[Session]
session.save_handler = memcache
session.save_path=tcp://192.168.0.106:11216
也可以自己写程序将session的所有操作重写,不建议这么干
3、cookie只能存储字符串,session可以存储object,数组等更复杂的数据
4、cookie的长度受限制,各浏览器不一样,session基本没有,但不建议存储太大的数据进去

四、php操作session
1、开启session
session_start();
如果前面有输出,会报错,可以通过ob系列函数解决该问题
2、session增、改,正常全局变量使用
$_SESSION['test'] = 'add';
$_SESSION['test'] = 'edit';
3、session删除
unset($_SESSION['test']);
session_destroy();清除所有session
不要unset($_SESSION);