<?php
//==========================COOKIE===========================
//-----------------------------------------------------------
	/*
		Cookie属于头信息,勿在头信息前有任何的输出
	*/
	//-------------------------------------------------------
	//--------------------向Cookie中传值--------------------
	/* cookie中只能保持字符串,不可以存入数组 */
	$time=time()+60*60*7;//设置保存的时间
	//变量名,值,保存时间,还有其他参数无需关注
	setCookie("name","how are you",$time);
	setCookie("name1","howyou",$time);
	//-------------------------------------------------------
	//-------------------删除Cookie中的值-------------------
	$time=time();//将时间设为当前时间
	//将值清空,时间改为当前或以前的时间,或不传值与时间
	setCookie("name","",$time-200);
	setCookie("name1","",$time);
	setCookie("name1");
	//-------------------------------------------------------
	//---------------------调用Cookie------------------------
	//在任意一页面中
	echo $_COOKIE['name'];
//===========================================================




//=========================SESSION===========================
//-----------------------------------------------------------
	session_cache_expire		//设置或者获取session过期的时间
	session_cache_limiter		//设置或者获取session缓存的类型
	session_commit			//终止由session_start()函数开启的session可写入状态 session_write_close()函数的别名
	session_decode			//D将被序列化的session数据还原
	session_destroy			//销毁所有的已注册的session
	session_encode			//序列化当前session中的所有数据
	session_get_cookie_params//获取session cookie的相关数据的参数
	session_id				//定义或者获取当前的session id
	session_is_registered		//检测一个session是否已注册
	session_module_name		//取得或者设置一个session的储存形式
	session_name			//设置或者取得一个session name
	session_regenerate_id		//更新现有的session id
	session_register			//将一些字符串或者数组注册到session中
	session_save_path		//设置或者取得一个session在服务器短的保存路径
	session_set_cookie_params//设置session cookie的相关数据的参数
	session_set_save_handler	//方便自定义的设置session在服务器端的相关操作
	session_start				//开启session
	session_unregister		//取消一个已注册的session
	session_unset			//清空所有注册了的session值
	session_write_close		//终止由session_start()函数开启的session可写入状态

//==================基于cookie的session使用=================
//---------------------开启session方法----------------------
	/*
	1.每个页面都要 session_start()
	2.关闭浏览器$_SESSION[]的值消失
	
	每第一次开启就创建一个session_id并分配给客户端保存,
	默认保存在cookie中,当访问其他页面时会带着这个客户端
	的id当有id时不创建id。要想使用session每个页面都要写se
	ssion_start()。将php.ini中1056行的 session.auto_start =
	1 则每页可以不写session_start()就可开启session 但是有
	功能限制,如对象就不可以放在session中了,所以此方法不
	建议使用。session_start()前不要有任何输出,属于头函数
	*/
	session_start();	//开启session
	/*
	session.name = PHPSESSID		设置session名 约1053行
	session.cookie_path = /			cookie的路径
	session.gc_maxlifetime = 1440	最大的生存时间		
	*/
	//-------------------------------------------------------
	//------------------向session里传值---------------------
	$_SESSION['a']="hello";
	$_SESSION['b']=array(1,2);
	//-------------------------------------------------------
	//-----------------输出session里的值--------------------
	echo $_SESSION['a'];		//输出某个值
	print_r($_SESSION);		//打印出整个session数组
	//-------------------------------------------------------
	//----------------输出session id的两种方法--------------
	echo session_id();
	//可以看出session_id是存放在cookie中的
	echo $_COOKIE[session_name()];

//====================删除session的值========================
	//1.---------------删除session中的某个值----------------
	session_start();
	unset($_SESSION['a']);//删除session中的值
	/*但不可以unset($_SESSION)这是删除整个数组,下次使用则
	受影响*/
	//2.------------------清空整个session值-----------------*
	session_start();
	//1.清空$_session值,直接赋空值
	$_SESSION=array();
	//2.删除客户端的在cookie中的session id,先判断再删除
	if(isset($_COOKIE[session_name()])){
		/*此时的cookie要指定路径,因为在配置文件中指定了
		路径session.cookie_path = /  */
		setCookie(session_name(),"",time(),"/");
	}
	//最后彻底销毁session
	session_destroy();
//===================基于UIRL的session=======================
//--------------超链接中地址加入session值-------------------
	//在接收页面加入判断,判断有没有session id
	if($_GET['sid']){
		//设置session id
		session_id($_GET['sid']);
	}
	//在超链接中加入session id的值
	<a href="index.php?sid=<?php echo session_id(); ?>>">首页</a>
	//-------------------------------------------------------
	//--------------------用session名传值-------------------
	//PHPSESSION为SESSION名,用session名传值不用指定session_id()
	<a href="index.php?PHPSESSION=<?php echo session_id(); ?>>">首页</a>
	//------------------------------------------------------
	//----------------------手动加SID-----------------------
	/* SID:如果基于Cookie,SID则为空。如果关闭Cookie,SID则
	为PHPSESSION = cbdskvbfsbvvbhkfv45b */
	<a href="index.php?<?php echo SID ?>>">首页</a>
	//-------------------------------------------------------
	//-----------------------自动加SID-----------------------*
	/*	将配置文件中的1134行改为 session.use_trans_sid = 1 即
	可支持自动加SID功能。
		只支持一般的超链接自动加SID,不行的只能手动添加,如
	header('index.php')是不会自动添加的*/
	<a href="index.php">首页</a>
//============================================================
//=================解决跨机保存session设置问题==============
	//session信息保存的路径
	session.save_path = "C:/session"
	//session名称
	session.name = PHPSESSION
	//自动开启session,不建议自动开启,有功能限制
	session.auto_start = 0	//1为开启 0为关闭
	//没开启Cookie时在链接中自动添加SID
	session.use_trans_sid = 1
	//-------------------------------------------------------
	//----------------session信息的清除---------------------
	/*session生存时间,指定关闭浏览器后过了多少秒就会被视
	为垃圾,并根据如下概率清除*/
	session.gc_maxlifetime = 1440
	/*在初始化时启动session_start()即启动了垃圾回收器
	此概率为session.gc_probability / session.gc_diviso 即两
	值相除如下:两值相除为 1/100 */
	session.gc_probability = 1
	session.gc_divisor = 100	//此值根据网站的访问人数而定
	//-------------------------------------------------------
	//------------session基于cookie的cookie设置-------------
	//是否使用cookie保存客户端会话
	session.use_cookies =1 
	//cookie指定cookie保存的路径
	session.cookie_path = "/"
	//指定设置cookie会话的域名,默认为空,自动
	session.cookie_domain = ""
	/*cookie保存的时间,默认时间为0,表示关闭浏览器cookie就
	消失。如果此值不为0,则无论浏览器是否关闭或用户是否有
	动作,过了设置的时间cookie就会消失,即:过了设置时间就
	要重新登陆。*/
	session.cookie_lifetime = 0
	//-------------------------------------------------------
	//----------------session信息保存的方式-----------------
	/*session信息保存的方式,以文件形式保存值为 files也为
	默认值,如果自定义保存方式则值为 user。 如果保存在
	memcache中则值为memcache 且服务器路径
	session.save_path =tcp://localhost::11211 */
	session.save_handler = files
	
//================跨机保存session信息的操作方法=============
//---------------session_set_save_handler的使用--------------
	//使用前先改值 session.save_handler = user
	session_set_save_handler();
	//--------------------------------------------------------
	//启动会话
	//在运行session_start()时执行该函数
	function open($save_path,$session_name){
		echo "open<br>";
	}
	//在写关闭session_write_close()与销毁session_destroy()时执行
	function close(){
		echo "close<br>";
	}
	//读取session到$_SESSION中
	//在运行session_start()与写入$_SESSION 时执行
	function read($session_id){
		echo "read<br>";
	}
	//脚本结束时和session_write_close()强制提交数据时执行
	function write($session_id,$session_data){
		echo "write<br>";
	}
	//执行session_destroy()时执行
	function destroy($session_id){
		echo "destroy<br>";
	}
	//由session.gc_probability和session.gc_divisor决定的,
	//在执行open(),read()时也会执行gc()
	function gc($maxlifetime){
		echo "gc<br>";
	}
	
	session_set_save_handler("open","close","read","write","destroy","gc");
	
	session_start();
//===========================================================
//-----------------------------------------------------------







//========================Memcached==========================
//---------------------命令提示符下运行---------------------
/*
	安装:
	memcached -d install [uninstall]
	memcached -d start
	net start "Memcached Server"

	卸载:
	memcached -d stop
	memcached -d remove
	sc delete "Memcached Server"
	
	连接 Memcache
	telnet localhost 11211
	
	Memcache命令
	get			得到数据
	set			设置数据
	add			添加数据
	replace		替换数据
	append		追加数据
	delete		删除数据
	stats		查看状态
	quit		退出
	...
//-----------------------------------------------------------
//-------------stats查看状态信息中英文对照-----------------
	
	pid	memcache	服务器的进程ID
	uptime			服务器已经运行的秒数
	time			服务器当前的unix时间戳
	version			memcache版本
	pointer_size	当前操作系统的指针大小(32位系统一般是32bit)
	rusage_user		进程的累计用户时间
	rusage_system	进程的累计系统时间
	curr_items		服务器当前存储的items数量
	total_items		从服务器启动以后存储的items总数量
	bytes			当前服务器存储items占用的字节数
	curr_connections		当前打开着的连接数
	total_connections		从服务器启动以后曾经打开过的连接数
	connection_structures	服务器分配的连接构造数
	cmd_get			get命令(获取)总请求次数
	cmd_set	s		et命令(保存)总请求次数
	get_hits		总命中次数
	get_misses		总未命中次数
	evictions		为获取空闲内存而删除的items数(分配给memcache的空间用满后需要删除旧的items来得到空间分配给新的items)
	bytes_read		总读取字节数(请求字节数)
	bytes_written	总发送字节数(结果字节数)
	limit_maxbytes	分配给memcache的内存大小(字节)
	threads			当前线程数

//-----------------------------------------------------------
//----------------memcached的基本设置:---------------------
	
	-p 监听的端口
	-l 连接的IP地址, 默认是本机
	-d start 启动memcached服务
	-d restart 重起memcached服务
	-d stop|shutdown 关闭正在运行的memcached服务
	-d install 安装memcached服务
	-d uninstall 卸载memcached服务
	-u 以的身份运行 (仅在以root运行的时候有效)
	-m 最大内存使用,单位MB。默认64MB
	-M 内存耗尽时返回错误,而不是删除项
	-c 最大同时连接数,默认是1024
	-f 块大小增长因子,默认是1.25
	-n 最小分配空间,key+value+flags默认是48
	-h 显示帮助
*/
//===========================================================
//------------Memcache 面向对象的常用接口包括:------------

	Memcache::add			//添加
	Memcache::connect		//打开一个到Memcache的连接
	Memcache::pconnect	//打开一个到Memcache的长连接
	Memcache::close		//关闭一个Memcache的连接
	Memcache::set			//保存数据到Memcache服务器上
	Memcache::get			//提取一个保存在Memcache服务器上的数据
	Memcache::replace		//替换一个已经存在Memcache服务器上的项目(功能类似Memcache::set)
	Memcache::delete		//从Memcache服务器上删除一个保存的项目
	Memcache::flush		//刷新所有Memcache服务器上保存的项目(类似于删除所有的保存的项目)
	Memcache::getStats	//获取当前Memcache服务器运行的状态
	Memcache::addServer	//分布式服务器添加一个服务器 

	//Memcached 为 Memcache的进程

//===========================================================
//----------------向memcached添加数据-----------------------
	$mem=new Memcache;
	$mem->connect("localhost",11211);
	
	//添加多个服务器
	//mem->addServer("www.baidu.com","11221");
	//-------------------------------------------------------
	//-------------------添加数据---------------------------
	//参数位:数据名,保存的数据,[常量,[保存时间]]
	//MEMCACHE_COMPRESSED此常量表示用压缩的方式保存
	$mem->add("mystr","How are you",MEMCACHE_COMPRESSED,3600);
	//添加数组
	//常量与保存时间不写的话默认30天
	$mem->add("mystr1",array("hello","world","nihao"));
	//添加对象
	class person{
		var $name="Stephne";
	}
	$mem->add("mystr2",new person);
	//-------------------------------------------------------
	//--------------------输出数据--------------------------
	echo $mem->get("mystr");
	print_r($mem->get("mystr1"));
	var_dump($mem->get("mystr2"));
	//关闭
	$mem->close();
//===========================================================
//------------------覆盖已添加的值--------------------------
	//二者都可
	$mem->set("mystr","How are you---",MEMCACHE_COMPRESSED,3600);
	$mem->replace("mystr","How are you---",MEMCACHE_COMPRESSED,3600);
//-----------------------------------------------------------
//----------------------删除值-------------------------------
	$mem->delete("mysre");//删除一个
	$mem->flush();		//删除所有
//-----------------------------------------------------------
//--------------------获取信息------------------------------
	$mem->getVersion();	//获取版本信息
	$mem->getStats();		//取得状态
//-----------------------------------------------------------
//---------------------应用实例-----------------------------*
	$mem=new Memcache;
	$mem->connect("localhost",11211);
	//将sql语句作为数据名
	$sql="select id,title,addtime from film ";
	$key=$sql;
	//从memcached得到值
	$data=$mem->get($key);
	//判断$data里面是否有值,如果没有则进行传值
	if(!$data){
		//连接数据库
		$pdo=new PDO("mysql:host=localhost;dbname=film","root","320723");
		//执行查询语句
		$stmt=$pdo->prepare($sql);
		$stmt->execute();
		$data=array();
		//将值传入$data
		while($row=$stmt->fetch(PDO::FETCH_ASSOC)){
			$data[]=$row;
		}
		//添加值到memcached
		$mem->set($key,$data,MEMCACHE_COMPRESSED,3600);
		echo "加载数据完成";
	}
	//输出值
	print_r($data);
	//关闭
	$mem->close();
//===========================================================
//-----------------------------------------------------------