1.JSON方式封装通信接口:
封装: response.php
<?php
// JSON方式封装通信接口
// 定义 response类
class Response {// 定义一个静态方法,作用:按json方式产生数据 // 规范通信数据:参数一:状态码,参数二:消息提示(初始值为空),参数三:组装后的数据(初始值为空数组)// 注释码:/*** 按json方式输出通信数据* @param integer(数字类型) $code 状态码* @param string(字符串类型) $message 提示信息* @param array(数组类型) $data 数据* return(返回值) string(字符串类型)*/public static function json($code,$message = '',$data = array()){// 判断$code是否为数字if(!is_numeric($code)){return '';}//将三个参数组装成一个新的数组$result = array('code' => $code,'message' => $message,'data' => $data);// 通过json_encode(),产生json数据echo json_encode($result);// exit 终止程序且不输出exit;}
}?>
调用:test.php
<?php
// 加载Response类文件
require_once('./response.php');
// 定义一个数组变量
$arr = array('id' => 1,'name' => 'zhangsan'
);// 调用类文件中的json()方法
Response::json(200,'数据返回成功',$arr);
?>
2.XML方式封装通信接口
2.0.1 PHP生成xml数据
封装: response.php
public static function xml(){// header 发送一个http头信息,将类型改为"text/xml",用于暴露xml节点header("Content-Type:text/xml");// 生成xml数据(通过字符串拼接的方法,首先定义一个变量$xml,存储xml数据)// \n 用于换行$xml = "<?xml version='1.0' encoding='UTF-8'?>\n"; // 头信息$xml .= "<root>\n"; // 根节点$xml .= "<code>200</code>\n"; // 主体1$xml .= "<message>数据返回成功</message>\n"; // 主体2$xml .= "<data>\n"; // 主体3$xml .= "<id>1</id>\n";$xml .= "<name>zhangsan</name>\n";$xml .= "</data>\n";$xml .= "</root>";// 输出拼接后的xml数据echo $xml;}
2.0.2 xml方式封装通信数据接口
封装: response.php
<?php
// 定义 response类
class Response {// xml方式封装通信接口// 定义一个静态方法,作用:按xml方式产生数据 // 规范通信数据:参数一:状态码,参数二:消息提示(初始值为空),参数三:组装后的数据(初始值为空数组)// 注释码:/*** 按xml方式输出通信数据* @param integer(数字类型) $code 状态码* @param string(字符串类型) $message 提示信息* @param array(数组类型) $data 数据* return(返回值) string(字符串类型)*/public static function xmlEncode($code,$message,$data = array()){// 判断$code是否为数字if(!is_numeric($code)){return '';}//将三个参数组装成一个新的数组$result = array('code' => $code,'message' => $message,'data' => $data);// 生成xml数据// 发送header头信息,用于暴露xml节点header("Content-Type:text/xml");// 定义变量$xml,用于存储拼接后的xml数据$xml = "<?xml version='1.0' encoding='UTF-8'?>\n"; // 头信息$xml .= "<root>\n"; // 根节点// 使用xmlToEncode()方法解析$result$xml .= self::xmlToEncode($result);$xml .= "</root>";// 输出拼接后的xml数据echo $xml;}// 将$result拼接成新的xml数据// 参数:$data(新的数据),例如:$resultpublic static function xmlToEncode($data){// 解析$result// 定义变量$xml存储数据$xml = "";// 初始化 $attr,当$key不为数字时,$attr为空$attr = "";// foreach循环遍历$data数组foreach ($data as $key => $value) {// 判断$key为数字的情况if(is_numeric($key)){// 添加属性$attr = "id='{$key}'";$key = "item";}// $key是一个节点,$value是节点的一个数据,使用{}用于识别变量$xml .= "<{$key}{$attr}>\n"; // 开始标签// $value是数组,使用递归,循环输出(判断是否为数组,如果是,则再次调用xmlToEncode方法)// 在一个类的方法(函数)的上下文中,静态变量和函数被访问使用self:: ,通过is_array()判断$value是否为数组$xml .= is_array($value) ? self::xmlToEncode($value):$value; // 节点的数据$xml .= "</{$key}>\n"; // 结束标签}// 循环结束后,输出这一块组装好的xml数据return $xml;}
}// 调用Response类的方法
$data = array('id' => 1,'name' => 'zhangsan'
);
Response::xmlEncode(200,'success',$data);?>
3.综合方式封装通讯接口:
封装: response.php
<?php
// 定义 response类
class Response {// 综合方式封装通信接口// 定义一个静态方法,作用:综合方式产生数据 // 规范通信数据:参数一:状态码,参数二:消息提示(初始值为空),参数三:组装后的数据(初始值为空数组),参数四:数据类型(初始值为json)// 注释码:/*** 按综合方式输出通信数据* @param integer(数字类型) $code 状态码* @param string(字符串类型) $message 提示信息* @param array(数组类型) $data 数据* @param string(字符串类型) $type 数据类型* return(返回值) string(字符串类型)*/// 定义常量,默认数据类型const JSON = "json";public static function show($code,$message = '',$data = array(),$type = self::JSON){// 判断$code是否为数字if(!is_numeric($code)){return '';}// 判断类型,如果存在,则是通过get方法传来的值,如果不存在,则是默认值json$type = isset($_GET['format'])?$_GET['format']:self::JSON;//将四个参数组装成一个新的数组数据$result = array('code' => $code,'message' => $message,'data' => $data);// 如果数据类型为jsonif($type == 'json'){// 调用json()方法self::json($code,$message,$data);exit;}elseif($type == 'array') {// 如果数据类型为array(调试模式)// 直接输出$resultvar_dump($result);}elseif($type == 'xml') {// 如果数据类型为xml// 调用xmlEncode()方法self::xmlEncode($code,$message,$data);exit;}else{// 其他类型}}// JSON方式封装通信接口// 定义一个静态方法,作用:按json方式产生数据 // 规范通信数据:参数一:状态码,参数二:消息提示(初始值为空),参数三:组装后的数据(初始值为空数组)// 注释码:/*** 按json方式输出通信数据* @param integer(数字类型) $code 状态码* @param string(字符串类型) $message 提示信息* @param array(数组类型) $data 数据* return(返回值) string(字符串类型)*/public static function json($code,$message = '',$data = array()){// 判断$code是否为数字if(!is_numeric($code)){return '';}//将三个参数组装成一个新的数组$result = array('code' => $code,'message' => $message,'data' => $data);// 通过json_encode(),产生json数据echo json_encode($result);// exit 终止程序且不输出exit;}// xml方式封装通信接口// 定义一个静态方法,作用:按xml方式产生数据 // 规范通信数据:参数一:状态码,参数二:消息提示(初始值为空),参数三:组装后的数据(初始值为空数组)// 注释码:/*** 按xml方式输出通信数据* @param integer(数字类型) $code 状态码* @param string(字符串类型) $message 提示信息* @param array(数组类型) $data 数据* return(返回值) string(字符串类型)*/public static function xmlEncode($code,$message,$data = array()){// 判断$code是否为数字if(!is_numeric($code)){return '';}//将三个参数组装成一个新的数组$result = array('code' => $code,'message' => $message,'data' => $data);// 生成xml数据// 发送header头信息,用于暴露xml节点header("Content-Type:text/xml");// 定义变量$xml,用于存储拼接后的xml数据$xml = "<?xml version='1.0' encoding='UTF-8'?>\n"; // 头信息$xml .= "<root>\n"; // 根节点// 使用xmlToEncode()方法解析$result$xml .= self::xmlToEncode($result);$xml .= "</root>";// 输出拼接后的xml数据echo $xml;}// 将$result拼接成新的xml数据// 参数:$data(新的数据),例如:$resultpublic static function xmlToEncode($data){// 解析$result// 定义变量$xml存储数据$xml = "";// 初始化 $attr,当$key不为数字时,$attr为空$attr = "";// foreach循环遍历$data数组foreach ($data as $key => $value) {// 判断$key为数字的情况if(is_numeric($key)){// 添加属性$attr = "id='{$key}'";$key = "item";}// $key是一个节点,$value是节点的一个数据,使用{}用于识别变量$xml .= "<{$key}{$attr}>\n"; // 开始标签// $value是数组,使用递归,循环输出(判断是否为数组,如果是,则再次调用xmlToEncode方法)// 在一个类的方法(函数)的上下文中,静态变量和函数被访问使用self:: ,通过is_array()方法判断$value是否为数组$xml .= is_array($value) ? self::xmlToEncode($value):$value; // 节点的数据$xml .= "</{$key}>\n"; // 结束标签}// 循环结束后,输出这一块组装好的xml数据return $xml;}
}// 调用Response类的方法
$data = array('id' => 1,'name' => 'zhangsan'
);
Response::xmlEncode(200,'success',$data);?>
调用:test.php
<?php
// 加载Response类文件
require_once('./response.php');
// 定义一个数组变量
$data = array('id' => 1,'name' => 'zhangsan','type' => array(4,5,6),'test' => array(1,45,67=>array(123,'tsysa'))
);// 调用类文件中的show()方法
Response::show(200,'数据返回成功',$data,'json');?>
4.将数据缓存值指定文件中:
封装:file.php
<?php
// 定义类,作用:处理静态缓存
class File {// 定义默认路径 $_dirprivate $_dir;// 定义文件后缀const EXT = '.txt';// 将默认路径放在构造函数里面public function __construct(){// dirname(__FILE__)获取文件当前目录(即当前php文件所在的目录)// 设置默认缓存文件地址$this->_dir = dirname(__FILE__).'/files/';}// 将获取缓存,生成缓存,删除缓存 封装在一个方法中// 参数一:缓存文件的文件名,参数二:缓存数据(默认值为空),参数三:保存缓存的文件路径(默认值为空)public function cacheData($key,$value = '',$path = ''){// 拼装成一个文件$filename = $this->_dir.$path.$key.self::EXT;// 判断$values是否存在if($value!==''){// 将value值写入缓存// 判断$value是否为null,为null则删除缓存if(is_null($value)){// unlink() 删除缓存return @unlink($filename);}// 获取文件目录$dir = dirname($filename);// 判断目录是否存在,即判断存储缓存的文件是否存在,如果不存在,则创建缓存文件if(!is_dir($dir)){// 创建目录,参数一:文件目录名,参数二:设置权限mkdir($dir,0777);}// 将缓存数据写入文件// 参数一:缓存文件名,参数二:缓存数据(只能是字符串的形式,通过json_encode()转换)return file_put_contents($filename,json_encode($value));}// 判断$filename是否存在if(!is_file($filename)){return FALSE;}else{// file_get_contents()获取缓存值// json_decode()将json 转换为数组形式return json_decode(file_get_contents($filename),true); // 传入true返回原值}}
}?>
调用:test.php
<?php
// 加载Response类文件
require_once('./file.php');
// 定义一个数组变量
$data = array('id' => 1,'name' => 'zhangsan','type' => array(4,5,6),'test' => array(1,45,67=>array(123,'tsysa'))
);// new一个File类
$file = new File();
// 调用cacheData()方法
$file->cacheData('index_mk_cache',$data);
// 添加缓存
if($file->cacheData('index_mk_cache',$data)){echo "success";
}else{echo "error";
}
// 获取缓存
if($file->cacheData('index_mk_cache'){var_dump($file->cacheData('index_mk_cache'));exit;echo "success";
}else{echo "error";
}
// 删除缓存
if($file->cacheData('index_mk_cache',null)){echo "success";
}else{echo "error";
}?>
.
// 开始封装:
通用:db.php
<?php
// 单例模式连接数据库
// 单例模式(限制类只能拥有一个实例)
// 定义一个类
class Db {// 配置数据库private $_dbConfig = array('host' => '127.0.0.1', // 数据库地址'user' => 'root', // 用户名'password' => '', // 密码'database' => 'video', // 数据库名);// 定义资源标识符(结果集)static private $_connectSource;// 用于一个保存类的实例的静态成员变量 $_instance// 使用静态私有变量保存类的实例static private $_instance;// __construct() 构造函数,函数执行时默认执行,一般用于初始化// 单例模式规定构造函数必须是非publicprivate function __construct(){}// 拥有一个访问这个实例的公共的静态方法// 定义getInstance()方法,便于在类的内部实例化类static public function getInstance(){// 检查类有没有被实例,如果有则返回变量if(!(self::$_instance instanceof self)){// 实例化类self::$_instance = new self();}// 返回一个类的实例return self::$_instance;}// php连接数据库public function connect(){// 判断资源是否存在if(!self::$_connectSource){// 连接数据库
// @是可以屏蔽函数执行过程中遇到问题而产生的一些错误、警告信息,这样用户就看不到程序的出错信息。这样除了用户界面会友好一些外,更重要的是安全性,因为屏蔽了出错文件的路径等信息。self::$_connectSource = @mysql_connect($this->_dbConfig['host'],$this->_dbConfig['user'],$this->_dbConfig['password']);// 如果没有返回资源if(!self::$_connectSource){die('数据库连接失败'.mysql_error());}// 选择数据库// 参数一:数据库名称,参数二:资源标识符(结果集)mysql_select_db($this->_dbConfig['database'],self::$_connectSource);// 设置字符集mysql_query("set names UTF8",self::$_connectSource);}// 返回连接数据库的资源return self::$_connectSource;}}// 调用
// 数据库的连接,返回结果集
$connect = Db::getInstance()->connect();
var_dump($connect);?>
方案一:读取数据库方式开发接口(直接连接数据库获取)
实例:list.php
<?php
// 引入接口类
require_once('./response.php');
// 数据库
require_once('./db.php');
// 接口样例:http://app.com/list.php?page=1&pagesize=10
// 定义页码,并判断是否存在,如果不存在给予默认值
$page = isset($_GET['page']) ? $_GET['page'] : 1;
$pageSize = isset($_GET['pagesize']) ? $_GET['pagesize'] : 1;
// 验证传值是否合法,判断是否为数字
if(!is_numeric($page)||!is_numeric($pageSize)){// 生成接口数据// 通过return告知其他工程师,下面程序不执行return Response::show(401,'数据不合法');
}
// 编写SQL语句
// order by XXX desc :倒序排序
// limit 起始位置,数据条数
$offset = ($page - 1) * $pageSize;
$sql = "select * from video where status = 1 order by orderby desc limit".$offset.",".$pageSize;
// 捕获异常
try{// $connect:连接标识符$connect = Db::getInstance()->connect();
}else(Exception $e){// 提示异常return Response::show(403,'数据库连接失败');
}
// $result:资源标识符(结果集)
$result = mysql_query($sql,$connect);
// 定义一个空数组,用于存储数据
$videos = array();
// while循环输出所有的数据
while($video = mysql_fetch_assoc($result)) {// 每次循环,自动生成id,且值会放入$videos数组中$videos[] = $video;
}// 使用Response类中的方法,将$videos中的数据转换为json格式
// Response::show('状态码','提示语句','原始数据')
if($videos){return Response::show(200,'首页数据获取成功',$videos);
}else{return Response::show(400,'首页数据获取失败',$videos);
}
?>
方案二:读取缓存方式开发接口(连接数据库获取的同时缓存一份,再次获取时不再连接数据库,而是读取缓存,可设置缓存失效时间)
方案三:定时读取缓存方式开发接口(通过crontab)