接口的主要功能是从服务器端获取数据,然后渲染到客户端

其主要的实现流程一般会经历这样的几个阶段
服务器端----》 数据库|缓存 ----》 调用接口 ----》客户端

在接口数据传输的过程中,一般采用Json或者Xml的数据格式进行传输,json在生成数据方面(json_encode)和传输速度上比较强,xml在数据的可读性能上比较强。

接下来封装一个完整的接口返回数据的公用方法,如下所示:

<?php
class Response {
const JSON = "json";
/**
* 按综合方式输出通信数据
* @param integer $code 状态码
* @param string $message 提示信息
* @param array $data 数据
* @param string $type 数据类型
* return string
*/
public static function show($code, $message = '', $data = array(), $type = self::JSON) {
if(!is_numeric($code)) {
return '';
} $type = isset($_GET['format']) ? $_GET['format'] : self::JSON; $result = array(
'code' => $code,
'message' => $message,
'data' => $data,
); if($type == 'json') {
self::json($code, $message, $data);
exit;
} elseif($type == 'array') {
var_dump($result);
} elseif($type == 'xml') {
self::xmlEncode($code, $message, $data);
exit;
} else {
// TODO
}
}
/**
* 按json方式输出通信数据
* @param integer $code 状态码
* @param string $message 提示信息
* @param array $data 数据
* return string
*/
public static function json($code, $message = '', $data = array()) { if(!is_numeric($code)) {
return '';
} $result = array(
'code' => $code,
'message' => $message,
'data' => $data
); echo json_encode($result);
exit;
} /**
* 按xml方式输出通信数据
* @param integer $code 状态码
* @param string $message 提示信息
* @param array $data 数据
* return string
*/
public static function xmlEncode($code, $message, $data = array()) {
if(!is_numeric($code)) {
return '';
} $result = array(
'code' => $code,
'message' => $message,
'data' => $data,
); header("Content-Type:text/xml");
$xml = "<?xml version='1.0' encoding='UTF-8'?>\n";
$xml .= "<root>\n"; $xml .= self::xmlToEncode($result); $xml .= "</root>";
echo $xml;
} public static function xmlToEncode($data) { $xml = $attr = "";
foreach($data as $key => $value) {
if(is_numeric($key)) {
$attr = " id='{$key}'";
$key = "item";
}
$xml .= "<{$key}{$attr}>";
$xml .= is_array($value) ? self::xmlToEncode($value) : $value;
$xml .= "</{$key}>\n";
}
return $xml;
} }

缓存在接口中会有大量的使用,关于缓存又分为静态缓存和redis/memcache缓存,先说静态缓存的实现,一般是将数据写入日志,查看日志时用的比较多,即写入静态文件中。

<?php

class File {
private $_dir; const EXT = '.txt'; public function __construct() {
$this->_dir = dirname(__FILE__) . '/files/';
}
public function cacheData($key, $value = '', $cacheTime = ) {
$filename = $this->_dir . $key . self::EXT; //写入文件缓存
if($value !== '') { // 将value值写入缓存
if(is_null($value)) {
return @unlink($filename);
}
$dir = dirname($filename);
if(!is_dir($dir)) {
mkdir($dir, );
} $cacheTime = sprintf('%011d', $cacheTime);
return file_put_contents($filename,$cacheTime . json_encode($value));
} //获取文件缓存
if(!is_file($filename)) {
return FALSE;
}
$contents = file_get_contents($filename);
$cacheTime = (int)substr($contents, ,);
$value = substr($contents, );
if($cacheTime != && ($cacheTime + filemtime($filename) < time())) {
unlink($filename);
return FALSE;
}
return json_decode($value, true); }
} $file = new File(); echo $file->cacheData('test1');

在接口中常用的缓存为redis缓存,他拥有memcache的所有功能,而且还支持多种数据类型。缓存的数据存放在内存中,读取速度相当于读取文件来说更快一些。

redis 缓存的设置只需要选择数据库(0-15),直接设置key,value值和过期时间即可,封装的方法如下:

<?php
class RedisDB
{
static $_instance; //存储对象
public $handler ;
private function __construct($dbindex = )
{
global $_G ;
$data = $_G['config']['redis']['redis']['params'];
if ( !extension_loaded('redis') ) {
throw new Exception("REDIS NOT SUPPORT", );
}
$this->handler = new Redis();
//从配置读取
$this->handler->connect($data['hostname'],$data['port']);
$this->handler->auth($data['auth']);
$this->handler->select($dbindex);
}
public static function getInstance($dbindex = ){
if(!isset(self::$_instance[$dbindex]) or FALSE == (self::$_instance[$dbindex] instanceof self)){
self::$_instance[$dbindex] = new self($dbindex);
}
return self::$_instance[$dbindex];
} /**key value get**/
public function GET($key)
{
return $this->handler->get($key);
}
/**key value set 过期时间为 $exp**/
public function SET($key ,$value ,$exp)
{
$this->handler->setex($key ,$exp ,$value );
} /*移除数据$key*/
public function REMOVE($key)
{
$this->handler->delete($key); } /*设置数据的过期时间$key*/
public function EXPIRE($key ,$exp)
{
$this->handler->expire($key ,$exp);
} /**Hash 相关**/ public function HGET($domain , $key)
{
return $this->handler->hGet($domain , $key);
}
public function HSET ($domain ,$key ,$value )
{
$this->handler->hSet($domain , $key);
} public function HREMOVE($domain ,$key)
{
$this->handler->hDel($domain , $key); } /*插入列表*/
public function PushList($channel,$data)
{
$this->handler->lPush($channel,$data);
} /*从列表中获取*/
public function POPList($channel)
{
return $this->handler->lPop($channel);
} } ?>

PHP开发接口,封装方法的更多相关文章

  1. SQL Server开发接口生成方法

    为提高开发效率,生成固定格式的接口是必须的,以下以提供新增/修改/删除/读取接口为例: 以常见的表结构为例,特殊表结构可自己尝试去调整方法 主要通过系视图 sys.columns生成方法:为包含列的对 ...

  2. 基于Zabbix API文档二次开发与java接口封装

    (继续贴一篇之前工作期间写的经验案例) 一.           案例背景 我负责开发过一个平台的监控报警模块,基于zabbix实现,需要对zabbix进行二次开发. Zabbix官方提供了Rest ...

  3. sdk开发时,对外暴露的接口封装

    思考,用同步还是异步? 实质就是屏蔽一些东西,让使用者直接传参数 拿结果 而不用关心具体实现 eg.登陆接口 1.定义接口LoginCallBack,两个函数 请求成功和失败 public inter ...

  4. PHP开发接口使用RSA进行加密解密方法

    网络安全问题很重要,尤其是保证数据安全,遇到很多在写接口的程序员直接都是明文数据传输,在我看来这是很不专业的.本人提倡经过接口的数据都要进行加密解密之后进行使用. 这篇文章主要介绍使用PHP开发接口, ...

  5. 用ladon框架封装Python为Webservice接口以及调用接口的方法

    一.用ladon框架封装Python为Webservice接口 功能实现的同时,希望将接口开放给别人,而封装python接口的一个再简单不过的框架Ladon,而且提供不同的协议,包括SOAP和Json ...

  6. Plx9030通讯卡驱动开发与接口封装

    在学校的时候,曾经采用DDK+Driverstudio+VC6.0环境做过9054视频采集卡的驱动开发,回想起调试过程,记得最清楚的就是过无数次的计算机蓝屏重启....今天第一天来到新公司,老大就说你 ...

  7. Java微信公众平台接口封装源码分享

    前言:      这篇博客是在三月初动手项目的时候准备写的,但是为了完成项目只好拖延时间写这篇博客,顺便也可以在项目中应用我自己总结的的一些经验.今天看来,这些方法的应用还是可以的,至少实现了我之前的 ...

  8. MyBatis学习--mybatis开发dao的方法

    简介 使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法. 主要概念介绍: MyBatis中进行Dao开发时候有几个重要的类,它们是SqlSessionFac ...

  9. 11Mybatis_mybatis开发Dao的方法

    在介绍开发Dao的方法之前先介绍下SqlSession. 1.先介绍一下SqlSessionFactoryBuilder:通过SqlSessionFactoryBuilder创建会话工厂SqlSess ...

  10. Java基础学习笔记十二 类、抽象类、接口作为方法参数和返回值以及常用API

    不同修饰符使用细节 常用来修饰类.方法.变量的修饰符 public 权限修饰符,公共访问, 类,方法,成员变量 protected 权限修饰符,受保护访问, 方法,成员变量 默认什么也不写 也是一种权 ...

随机推荐

  1. HDFS高可用性及其分布式系统思想基础

    源自单点失效问题,也就是当NameNode不可用的时候,用什么办法可以平滑过渡? 最直接的办法是再添加一个备用的NN,这就产生了Active NameNode和Standby NameNode的设计思 ...

  2. Linux 常用环境变量

    /etc/profile.d/start.sh # java export JAVA_HOME=/usr/local/jdk export CLASSPATH=.:$CLASSPATH:$JAVA_H ...

  3. 值得一看!2018年最优秀的9个Android Material Design Apps!

    今年4月,谷歌Gmail推出了全新的设计外观,全新的配色方案,更多的空白区域和精致的图标.也带来了Material Design 的一些改变 – Material Theming (材料主题),旨在自 ...

  4. 一次HBase问题的解决过程(Status: INCONSISTENT)

    ==版本信息== HBase:2.7.1 Storm:1.0.1 RocketMQ:3.4.6(阿里版) ==问题描述== 2018年9月3号晚上23点左右,例行巡检系统运行状况时, 发现Storm消 ...

  5. systemctl自定义service

    应用场景:开启自启动运行脚本/usr/local/manage.sh 一.服务介绍 CentOS 7的服务systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和用户 ...

  6. python按行读取并替换

      fp = open(''test2.txt','w') #打开你要写得文件test2.txt lines = open('test1.txt').readlines() #打开文件,读入每一行 f ...

  7. Google Maps 基础

    创建一个简单的 Google 地图 现在让我们创建一个简单的 Google 地图. 以下是显示了英国伦敦的 Google 地图: <!DOCTYPE html> <html> ...

  8. 排列<一>

    理论和习题来源于书本,有些能用计算机模拟的题尽量用代码来解. 1.5个球放在3个不同的盒子里面,允许有盒子不放球,求有多少种可能?解:穷举,设盒子A,B,C,每个盒子都有0-5个球的可能,但是三个盒子 ...

  9. ZOJ2418 Matrix 2017-04-18 21:05 73人阅读 评论(0) 收藏

    Matrix Time Limit: 2 Seconds      Memory Limit: 65536 KB Given an n*n matrix A, whose entries Ai,j a ...

  10. PAT甲 1046. Shortest Distance (20) 2016-09-09 23:17 22人阅读 评论(0) 收藏

    1046. Shortest Distance (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The ...