Ref: https://www.imooc.com/video/2873php
服务端如何为客户端(app)的首页提供数据接口,html
本篇用此做为例子演示接口的实现。mysql
class Db { static private $_instance;
static private $_connectSource;
private $_dbConfig = array(
'host' => 127.0.0.1',
'user' => 'root',
'password' => '',
'database' => 'video',
);
private function __construct() { } static public function getInstance() {
if (!self::$_instance instanceof self)) { self::$_instance = new self(); # 实例化的方法有点小意思
}
return self::$_instance; } }
该类返回一个可用的数据库链接。sql
Ref: http://www.runoob.com/php/func-mysqli-select-db.html数据库
Ref: http://www.w3school.com.cn/php/func_mysql_query.asp数组
public function connect() {
if (!self::$_connectSource) {
# step 1, 链接 self::$_connectSource = mysql_connect($this->_dbConfig['host'], $this->_dbConfig['user'], $this->_dbConfig['password']);
if (!self::$_connectSource) {
die('mysql connect error' . mysql_error());
}
mysql_select_db($this->_dbConfig['database'], self::$_connectSource)
$sql = "SELECT * FROM Person";
mysql_query($sql, self::$_connectSource);
}
return self::$_connectSource;
}
$connect = Db::getInstance()->connect(); var_dump($connect); Output: resource(3, mysql link)
$connect = Db::getInstance()->connect();
$sql = "select * from video";
$result = mysql_query($sql, $connect);
echo mysql_num_rows($result) var_dump($result); [Output]
2 resource(4, mysql result)
<?php require_once('./response.php');
require_once('./db.php');
# 解析URL $page = isset($_GET['page']) ? $_GET['page'] : 1; $pageSize = isset($_GET['pagesize']) ? $_GET['pagesize'] : 1; if (!is_numeric($page) || !is_numberic($pageSize)) { return Response::show(401, "数据不合法”); }
# sql语句的构造
$offset = ($page - 1) * $pageSize;
$sql = "select * from video where status = 1 order by orderby desc limit " . $offset. "," . $pageSize;
# 链接数据库
$connect = Db::getInstance()->connect();
$result = mysql_query($sql, $connect);
var_dump($result);
URL: app.com/list.php?format=xml&page=xxxxx缓存
page参数能够取到,可是不合法的。服务器
补充:实现接口,固然也要建立相应的接口文档,以下。app
[list.php]ide
<?php // http://app.com/list.php?page-=1&pagesize=12 require_once('./response.php'); require_once('./file.php'); ------------------------------------------------------------------ $file = new File(); $data = $file->cacheData('index_cron_cahce'); if($data) { return Response::show(200, '首页数据获取成功', $data); }else{ return Response::show(400, '首页数据获取失败', $data); } exit;
------------------------------------------------------------------ require_once('./db.php'); require_once('./file.php');
$page = isset($_GET['page']) ? $_GET['page'] : 1; $pageSize = isset($_GET['pagesize']) ? $_GET['pagesize'] : 6;
if(!is_numeric($page) || !is_numeric($pageSize)) { return Response::show(401, '数据不合法'); }
------------------------------------------------------------------ $offset = ($page - 1) * $pageSize; $sql = "select * from video where status = 1 order by orderby desc limit ". $offset ." , ".$pageSize;
------------------------------------------------------------------ $cache = new File(); $videos = array();
if(!$videos = $cache->cacheData('index_mk_cache' . $page .'-' . $pageSize)) { echo 1;exit;
-------------------------------------------------------------- try {
/**
* 链接方法,若是链接失败了,经过异常处理方式解决
*/ $connect = Db::getInstance()->connect();
} catch(Exception $e) { // $e->getMessage(); 仅用于调试模式 return Response::show(403, '数据库连接失败'); }
-------------------------------------------------------------- $result = mysql_query($sql, $connect); while($video = mysql_fetch_assoc($result)) { $videos[] = $video; }
/**
* 得到了sql的查询结果,而后在结果中一行行读取构成一个咱们熟悉的数组的形式:videos[]
* 这个结果能够以后以缓存的形式存在下去。
*/
if($videos) { $cache->cacheData('index_mk_cache' . $page .'-' . $pageSize, $videos, 1200); } }
------------------------------------------------------------------ if($videos) { return Response::show(200, '首页数据获取成功', $videos); } else { return Response::show(400, '首页数据获取失败', $videos); }
mysql_fetch_assoc:
从结果集中取得一行做为关联数组。返回根据从结果集取得的行生成的关联数组,若是没有更多行,则返回 false。
进一步地,咱们开始考虑如何利用缓存。
[1] 对静态缓存的改进
在我获取的时候:缓存文件时间 + 缓存失效时间 与 当前时间 作个对比。
经过如下字符串截取手段获取 cacheTime & value。
$contents = file_get_contents($filename); $cacheTime = (int)substr($contents, 0 ,11); # 把缓存失效时间截取出来 $value = substr($contents, 11); # 截取value
/**
* cacheTime = 0 表示永久有效
*/ if($cacheTime !=0 && ($cacheTime + filemtime($filename) < time())) { unlink($filename); # 删除缓存文件 return FALSE; }
[2] 调用静态缓存
<?php // http://app.com/list.php?page-=1&pagesize=12 require_once('./response.php'); require_once('./db.php');
require_once('./file.php'); ------------------------------------------------------------------ $file = new File(); $data = $file->cacheData('index_cron_cahce'); if($data) { return Response::show(200, '首页数据获取成功', $data); }else{ return Response::show(400, '首页数据获取失败', $data); } exit; ------------------------------------------------------------------ require_once('./db.php'); require_once('./file.php'); $page = isset($_GET['page']) ? $_GET['page'] : 1; $pageSize = isset($_GET['pagesize']) ? $_GET['pagesize'] : 6; if(!is_numeric($page) || !is_numeric($pageSize)) { return Response::show(401, '数据不合法'); } ------------------------------------------------------------------ $offset = ($page - 1) * $pageSize; $sql = "select * from video where status = 1 order by orderby desc limit ". $offset ." , ".$pageSize; ------------------------------------------------------------------ $cache = new File(); $videos = array(); if( !$videos = $cache->cacheData('index_mk_cache' . $page .'-' . $pageSize) ) { echo 1;exit; # 说明缓存失效
# If 缓存失效,则以下读取数据库,固然以后也要设置新的缓存 -------------------------------------------------------------- try { /** * 链接方法,若是链接失败了,经过异常处理方式解决 */ $connect = Db::getInstance()->connect(); } catch(Exception $e) { // $e->getMessage(); 仅用于调试模式 return Response::show(403, '数据库连接失败'); } -------------------------------------------------------------- $result = mysql_query($sql, $connect); while($video = mysql_fetch_assoc($result)) { $videos[] = $video; } /** * 得到了sql的查询结果,而后在结果中一行行读取构成一个咱们熟悉的数组的形式:videos[] * 这个结果能够以后以缓存的形式存在下去。 */ if($videos) { $cache->cacheData('index_mk_cache' . $page .'-' . $pageSize, $videos, 1200); } }
# If 缓存已存在,则直接读取缓存数据 in $videos 就行了 ------------------------------------------------------------------ if($videos) { return Response::show(200, '首页数据获取成功', $videos); } else { return Response::show(400, '首页数据获取失败', $videos); }
1. 掌握如何编写定时脚本程序
2. 理解服务器如何提早准备数据
提早准备好,而不是第一次经过数据库的方式。
咱们但愿的是:第一次就铜鼓缓存获取数据,这个缓存的内容是定时导入的。
cron.php定时执行 list.php。
[list.php]
<?php // 让crontab定时执行的脚本程序 */5 * * * * /usr/bin/php /data/www/app/cron.php // 目的:想获取video表中 6条数据 require_once('./db.php'); require_once('./file.php'); $sql = "select * from video where status = 1 order by orderby desc"; try { $connect = Db::getInstance()->connect(); } catch(Exception $e) { // $e->getMessage(); file_put_contents('./logs/'.date('y-m-d') . '.txt' , $e->getMessage()); # 记录日志 return; }
$result = mysql_query($sql, $connect);
---------------------------------------------------------------------------------------
$videos = array(); while($video = mysql_fetch_assoc($result)) { $videos[] = $video; }
---------------------------------------------------------------------------------------
$file = new File(); if($videos) { $file->cacheData('index_cron_cahce', $videos); # 默认是永久有效的 } else { file_put_contents('./logs/'.date('y-m-d') . '.txt' , "没有相关数据"); } return;