file_get_contents了解:自定义http请求

编	写:袁	亮
时	间:2015-07-17
说	明:file_get_contents了解:自定义http请求

一、使用原因
	1、这是一个使用非常频繁的函数,对应的file_put_contents,都是文件操作中第一选择
	2、抓取网络内容,一般情况下,也是使用的这个,但遇到稍微麻烦点的,我们就觉得没法子了
	3、curl等能做的,其实file_get_contents也基本上都能做,只是大家不熟悉
	
二、简单范例,直接看php.net
	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);
	
三、核心函数 stream_context_create
	1、支持以下协议,生成相应资源流上下文
		http://php.net/manual/zh/wrappers.php
		file:// — 访问本地文件系统
		http:// — 访问 HTTP(s) 网址
		ftp:// — 访问 FTP(s) URLs
		php:// — 访问各个输入/输出流(I/O streams)
		zlib:// — 压缩流
		data:// — 数据(RFC 2397)
		glob:// — 查找匹配的文件路径模式
		phar:// — PHP 归档
		ssh2:// — Secure Shell 2
		rar:// — RAR
		ogg:// — 音频流
		expect:// — 处理交互式的流
	
	2、http资源流支持参数:
		http:http://php.net/manual/zh/context.http.php
		http协议支持的参数,基本都支持
		header头,post数据,user_agent,代理,超时,跟随重定向等等
		
	3、post数据设置范例
		$postdata = http_build_query(
			array(
				'var1' => 'some content',
				'var2' => 'doh'
			)
		);
		$opts = array('http' =>
			array(
				'method'  => 'POST',
				'header'  => 'Content-type: application/x-www-form-urlencoded',
				'content' => $postdata
			)
		);
		$context = stream_context_create($opts);
		$result = file_get_contents('http://example.com/submit.php', false, $context);
		

如何查看自己的内外网ip以及服务器ip

编	写:袁	亮
时	间:2015-07-17
说	明:如何查看自己的内外网ip以及服务器ip

一、查看自己的ip
	1、内网ip
		1.1 打开cmd命令行模式
		1.2 输入ipconfig 找到ipv4地址以及默认网关
		1.3 想要查看更详细的网络配置,比如mac地址等,输入ipconfig /all
	2、外网地址
		2.1 直接打开百度,输入ip,即可看到自己当前的ip以及归属地
		2.2 也可以上tool.ci123.com 查看
	
二、查看linux服务器地址
	1、命令行模式,直接输入ifconfig
	2、线上服务器有时候会执行不了,因为账号没权限
	3、每块网卡都会有相应的一段输出,看下说明即可

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、保存设置,登陆即可

coreseek排错:api版本不对导致搜索错误

编	写:袁	亮
时	间:2015-07-17
说	明:coreseek搜索的一个小提示

一、问题描述
	1、在本地254上,搭建了3.2.14 版本的coreseek服务端
	2、searched进程启动
	3、命令行模式下搜索有数据
	4、使用php的api搜索,没有返回值,也没有报错
	
二、问题排查
	1、使用api搜索的,如果出现问题,第一反应输出其本身的错误信息,last_error还是什么的,查一下
	2、api的版本和coreseek的版本不一致,导致不能搜索
	3、找到对应版本的php api即可

curl番外:linux命令行下使用

编	写:袁	亮
时	间:2015-07-17
说	明:curl番外:linux命令行下使用

一、常用命令
	1、直接抓取网页
		curl http://www.ci123.com

	2、抓取数据,并保存成文件
		curl -O http://192.168.0.62/yl/curl/demo.php //需要后面有具体文件名,否则抓取不到
		curl -o index.html http://www.ci123.com
		
	3、仅显示http响应头
		curl -I http://www.ci123.com
		
	4、发送post数据
		4.1 普通post
			curl -d "username=name&nickname=暗夜御林" http://192.168.0.62/yl/curl/demo.php
		4.2 上传文件的时候,-F每次只能设置一个参数项,不能多个,文件名用@符号加载地址前
			curl -F "file=@51268106.html" -F "username=name" -F "nickname=暗夜御林" http://192.168.0.62/yl/curl/demo.php
	
	5、模拟登陆,使用cookie文件夹
		5.1 将cookie写入到本地文件(使用-F可以)
			curl -c cookie.txt http://192.168.0.62/yl/curl/demo.php
			curl -D cookie.txt http://192.168.0.62/yl/curl/demo.php //直接将响应头存储进文件
		5.2 使用本地存储的cookie文件发送请求
			curl -b cookie.txt http://192.168.0.62/yl/curl/demo.php
			
	6、伪造referer
		curl -e 'http://www.baidu.com' http://192.168.0.62/yl/curl/demo.php
	
	7、使用代理访问(找免费代理,翻墙出去,google搜索比较给力)
		curl -x 124.202.183.170:8118 http://www.baidu.com
		

fsockopen初阶:了解并使用

编	写:袁	亮
时	间:2015-07-16
说	明:fsockopen初阶:了解并使用

一、作用(简单使用)
	1、类似file_get_contents,curl,在程序中,发起一次网络请求,抓取数据或者调用接口等
	2、curl能干的事,这个也都能干
	3、在发起http请求的时候,会对http整个工作过程更熟悉,每一步都很清楚
	
二、工作流程
	1、使用fsockopen打开一个网络连接或者一个Unix套接字连接
	2、使用fwrite,传输请求头信息
	3、使用fgets读取响应
	4、使用fclose关闭套接字
	ps:一个完整的http请求,更清晰些,平时访问网页的时候,浏览器帮我们做的这些工作

三、使用条件
	1、php配置中开启 allow_url_fopen
		
四、简单范例,php.net
	
	$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
	if (!$fp) {
		echo "$errstr ($errno)
\n"; } else { $out = "GET / HTTP/1.1\r\n"; $out .= "Host: www.example.com\r\n"; $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); while (!feof($fp)) { echo fgets($fp, 128); } fclose($fp); }
五、函数封装 header("Content-Type:text/html;charset=utf-8;"); $data = fsockOpenHttp("http://local.ci123.com/yl/fsockopen/t.php",'POST',array('username'=>'yuanliang847','nickname'=>'暗夜御林')); var_export($data); //图片上传的暂未封装,可以自己看下firebug中上传图片时的请求信息,然后封装 function fsockOpenHttp($url, $method='GET', $postfields = NULL , $multi = false){ $url = trim($url); if(!$url){ return array('status'=>4001,'mess'=>'链接不能为空'); } $urlinfo = parse_url($url); if(!$urlinfo['host']){ return array('status'=>4002,'mess'=>'链接非法,请填写完整链接地址'); } if($urlinfo['scheme'] == 'https'){//判断是否是https请求 $port = 443; $version = '1.1'; $host = 'ssl://'.$urlinfo['host']; }else{ $port = 80; $version = '1.0'; $host = $urlinfo['host']; } $urlinfo['path'] = $urlinfo['path']?$urlinfo['path']:'/'; $header = "{$method} {$urlinfo['path']} HTTP/$version\r\n"; $header .= "Host: {$urlinfo['host']}\r\n"; if($multi){ //$header .= "Content-Type: multipart/form-data; boundary=\r\n"; }else{ $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; } if(strtolower($method) == 'post' ){ if(is_array($postfields)){ $postfields = http_build_query($postfields); } $header .= "Content-Length: ".strlen($postfields)."\r\n"; $header .= "Connection: Close\r\n\r\n"; $header .= $postfields; }else{ $header .= "Connection: Close\r\n\r\n"; } $ret = ''; $fp = fsockopen($host,$port,$errno,$errstr,30); if(!$fp){ return array('status'=>4003,'mess'=>'建立sock连接失败'); } fwrite ($fp, $header); while (!feof($fp)) { $ret .= fgets($fp, 4096); } fclose($fp); $info = split("\r\n\r\n",$ret); $t = array_slice($info,1); $returnInfo = implode('',$t); $head = $info[0]; $tmp = split("\r\n", $head); $tmp = split(" ", $tmp[0]); $http_status = $tmp[1]; $html = iconv("utf-8","utf-8//ignore",$returnInfo); return array( 'status' => '1', 'mess' => '请求成功', 'http_status'=> $http_status,//http响应头 'head' => $head,//完整返回头 'data' => $html//响应内容 ); }

http basic认证的那些事


编	写:袁	亮
时	间:2015-07-13
说	明:http basic认证的那些事

一、什么是http basic认证?
	1、由http协议规定
	2、提供简单的用户验证功能,适合于对安全性要求不高的地方
	3、通过在http头部增加
		Authorization: Basic username:password
		的方式,来向服务端证明自己是一个被授权访问的用户
	4、优点:
		简单、方便
	5、缺点:
		安全性太低,账号密码容易泄露,而且不方便升级维护
	6、替代协议
		oauth,使用oauth可以提供更安全的授权访问,但是实现较复杂
		现有oauth已经到了2.0版本,有兴趣的可以去了解下
	
二、常见使用方式
	1、最熟悉的,应该是大家家里的路由器登陆页面,那就是一个典型的http basic认证
	2、一些比较旧的项目后台,也会有这种登陆方式
	3、自己写一些临时后台,又不想介入复杂的账号体系的话,也可以使用该验证方式

三、工作流程
	1、浏览器第一次访问,没有带上相应账号密码请求
	2、服务器端,判断如果没有带上相应请求头Authorization: Basic,则返回401状态码,以及
		WWW-Authenticate:Basic realm="验证输入框标题"
	3、浏览器收到401状态码,弹出各浏览器自行实现的账号、密码输入框供用户输入
	4、浏览器将用户输入的用户和密码拼接,并加入到请求头中
		Authorization: Basic base64_encode(username:password)
	5、服务端将内容解析出来,并与自己的账号密码库比对,如果失败,继续要求填写账号密码
		如果正确,则继续访问,并在之前的每次访问都带上相应的请求头
	
四、几种实现方式
	1、apache设置【主要使用】
		1.1 开启设置,在httpd.conf文件中,相应目录上设置(需要重新apache服务)
			AuthType Basic
            AuthName "请输入你的账号密码"
            AuthUserFile .htpasswd	#账号密码存储文件位置
            Require valid-user #账号文件中的所有用户都可访问
		1.2 添加账号
			/opt/ci123/apache/bin/htpasswd -m /opt/ci123/www/html/geekman/.htpasswd username
			//注意,第一次添加需要加-cm参数创建文件,之前不允许加-c,否则会直接覆盖那个文件,导致其他账号丢失
		1.3 修改密码,同添加
		1.4 删除账号,找到对应的账号文件,直接删除那一行即可
	2、php设置,弹出
		if (!isset($_SERVER['PHP_AUTH_USER'])) {
			header('WWW-Authenticate: Basic realm="My Realm"');
			header('HTTP/1.0 401 Unauthorized');
			echo 'Text to send if user hits Cancel button';
			die;
		} else {
			echo "

Hello {$_SERVER['PHP_AUTH_USER']}.

"; echo "

You entered {$_SERVER['PHP_AUTH_PW']} as your password.

"; //验证该账号密码是否在允许范围内 } 五、程序模拟访问带http basic的页面 1、两种请求方式 1.1 将账号密码拼接在链接中 http://username:password@192.168.0.249/memadmin/basic.php 1.2 请求头中增加 Authorization: Basic base64_encode(username:password) 2、curl模拟账号密码 curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_USERPWD, username:password); 3、rpc接口 初始化的时候,第三、第四个参数分别填用户名密码即可

curl:抓取https数据


编	写:袁	亮
时	间:2015-07-15
说	明:使用curl抓取https数据

一、为什么需要?
	未了安全考虑,很多网站使用了https域名
	https需要客户端和服务端都做openssl的验证
	
二、抓取设置
	1、方法一,设置为不验证证书【直接用这个,除非安全性要求特别高】
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
		ps:抓百度的时候需要注意,referer设置为百度本身的返回会又问题,可以自己尝试看看
	
	2、设置一个正确的证书验证
		2.1 下载最新的证书到本地
			wget http://curl.haxx.se/ca/cacert.pem
		2.2 设置使用证书
			curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,true); ;
			curl_setopt($ch,CURLOPT_CAINFO,dirname(__FILE__).'/cacert.pem');
			
三、一些错误情况(出错的情况下,开启curl_error($ch)查看)
	1、centos系统,如果不知道证书地址,则使用系统证书
		/etc/pki/tls/certs/ca-bundle.crt
	2、如果系统证书过期,或者错误,则会显示签名出错
		通过wget http://curl.haxx.se/ca/cacert.pem 来更新最新的证书
	3、显示“段错误”,有可能是libcurl和php版本不一致导致
		线上centos 6.2和php 5.2.17,出现过该问题
	4、当不能确定是否是某台服务器出问题的时候,写个简单的demo,分别在几台服务器运行看下是否有问题
	
四、尚未解决
	1、采用浏览器下载或者导出的证书,在程序中一直未能使用成功
	
	
	
	

简单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语法的,性能也差