PHP 解决网站大访问量的例子

<?php
	function mysession_open($save_path,$sesssion_name){
		global $sesssion_save_path;   //定义session的存储位置
		$sesssion_save_path = "你要存储的session地址";
		return true;
	}

	function mysession_close(){
		return true;
	}

	function mysession_read($key) {
		global $sesssion_save_path;
		global $online;  //全局变量,用于存取队列前面的人数
		$online = 0;  //初始化
		$dir = opendir($sesssion_save_path); //读取文件夹,获取文件夹数
		while ($file = readdir($dir)) {
			if($file == ".." || $file ==".") {
				continue;
			}
			if(file_exists($sesssion_save_path.$key){  //如果当前session文件夹已经创建
				$mytime = fileatime($sesssion_save_path.$key);
				if(fileatime($sesssion_save_path.$file) < $mytime){ //计算队列前面人数的数目
					$online++;
				}
			}
			else{ //如果当前session文件没有创建
				$online++;//计算队列中的人数
			}
		}
		if(!file_exists($sesssion_save_path.$key)){ //如果文件不存在将当前数加1
			$online++;
		}
		return true;
	}

	function mysession_write($key,$data){
		global $sesssion_save_path;
		$fileame = $sesssion_save_path.$key;
		if(!file_exists($fileame)) {
			$fp = fopen($fileame, "w");//文件不存在则创建
			fputs($fp,"");
			fclose($fp);
		}
	}

	function mysession_destory($key) {
		global $sesssion_save_path;
		$fileame = $sesssion_save_path.$key;
		if(file_exists($fileame)){
			unlink($fileame);
		}
		return true;
	}

	function mysession_gc($expiry_time) {  //删除所有过期文件
		global $sesssion_save_path;
		$dir = opendir($sesssion_save_path);
		while ($file = readdir($dir)) {
			# code...
			if($file == ".." || $file == "."){
				continue;
			}
			if(fileatime($sesssion_save_path.$file) <= time() - $expiry_time){
				unlink($sesssion_save_path.$file);
			}
		}
		return true;
	}


	//设置用户自定义Session存储
	session_set_save_handler('mysession_open', 'mysession_close', 'mysession_read', 'mysession_write', 'mysession_destory', 'mysession_gc');

	//判断队列前面的人数并进行查询
	session_start();
	global $online;
	echo $online;
	if($online <= 10){   
	        //如果队列在前十名,则进行数据库查询,

		session_destroy();
	}


?>
通过对Session存取方式的自定义,将SessionID以文件名的方式存入了一个文件夹中。
每次打开页面时,都要通过当前文件夹中文件的数量判断当前用户所在的位置。如果位置在前十名,
则进行数据库相关操作并删除Session文件。这样做,能够保证数据库在大规模的访问下的稳定性。

评论 (0)

发表评论