落网数据库简单查询接口 caddy+php7+mongodb
落网数据库简单查询接口
一个简单的DEMO,使用了caddy + php7 + mongodb
数据库&接口设计 来自 https://github.com/Aedron/Luoo.spider 项目(V1.0版本分支)
参考地址:https://www.cnblogs.com/edit/p/luoo-service_caddy-php7-mongodb.html
环境配置:
下载程序,新建一个目录,比如 C:\web
https://caddyserver.com/download 下载caddy并解压到文件夹内,比如 C:\web\caddy_v1.0.0_windows_amd64
https://www.php.net/downloads.php 下载PHP7.3最新版并解压到文件夹内,比如 C:\web\php-7.3.5-nts-Win32-VC15-x64
https://www.mongodb.com/download-center/community 下载MongoDB社区版zip包 并解压到文件夹内,比如 C:\web\mongodb-win32-x86_64-2008plus-ssl-4.0.9
配置&启动脚本:
【PHP 安装mongodb拓展】
https://pecl.php.net/package/mongodb 下载最新的stable版本,比如现在是1.5.3,点击链接 “dll” ,在弹出的新页面里找到对应你PHP版本的地址然后下载。
下载完成后把 tgz包里面的 php_mongodb.dll 解压到 php 目录下的 ext 文件夹内。
找到 php目录下的 php.ini-production,复制一份并重命名为 php.ini ,打开文件加入两行配置
extension_dir = "ext"
extension = mongodb
【caddy 配置&启动脚本】
caddy目录下新建 root 文件夹,用来存放php或html页面
caddy目录下新建文本文件 Caddyfile (不需要后缀名),写入
访问域名 {
gzip
tls 你的邮箱 #如果不需要https可删除此行
root C:\web\root
errors {
404 404.html # Not Found
}
on startup _php_cgi.bat &
fastcgi php 127.0.0.1:6545 php
rewrite /luoo/ {
to {path} {path}/ /luoo.php?_url={path}&{query}
}
header /luoo {
Access-Control-Allow-Origin *
Access-Control-Allow-Methods "GET, POST, OPTIONS"
}
header / {
-Server
-X-Powered-By
}
}
caddy目录下新建文本文件 _php_cgi.bat,写入
:start
C:\web\php-7.3.-nts-Win32-VC15-x64\php-cgi.exe -b
goto start
然后就可以 双击caddy.exe 启动了,或者是配置成windows服务使用。
【Mongodb 配置&导入bson文件】
Mongodb 目录下新建 data 文件夹
Mongodb 目录下新建文本文件 _start.bat,写入
title MongoDB
cd bin
mongod --dbpath C:\web\mongodb-win32-x86_64-2008plus-ssl-4.0.\data
pause
双击 _start.bat ,即可启动 Mongodb 。
Mongodb 目录下新建文本文件 _import.bat,写入
title MongoDB import
echo MongoDB import
cd bin
mongorestore -d luoo C:\web\mongodb-win32-x86_64-2008plus-ssl-4.0.\luoo
pause
顺便去github上下载一份落网数据文件,地址在 https://github.com/Aedron/Luoo.spider/tree/master/db/luoo
下载完成后,把 db目录下的 luoo 文件夹拷贝到 Mongodb 目录下,然后运行上面的 _import.bat 脚本,即可完成数据导入。
PHP代码编写:
在 C:\web\root 目录下新建 luoo.php,写入
<?php
header('Content-Type:application/json; charset=utf-8');
if(empty($_GET['_url'])){
exit(json_encode(['code'=>'400','msg'=>'访问异常']));
}
$router = explode('/',str_replace('/luoo/','',$_GET['_url']));
define('API_LIST', ['vol','vols','single','singles','article','latest']);
if(!in_array($router[0],API_LIST)){
exit(json_encode(['code'=>'404','msg'=>'接口不存在']));
}
class Luoo{
private $manager;
private $config = ["latestVol"=>997,"latestSingle"=>20170721,"latestArticle"=>927];
public function __construct(){
$this->manager = new MongoDB\Driver\Manager();
}
private function getCount($collection,$where=[]){
$command = new MongoDB\Driver\Command(['count' => $collection,'query'=>$where]);
$result = $this->manager->executeCommand('luoo',$command);
$response = current($result->toArray());
if($response->ok==1){
return $response->n;
}
return 0;
}
private function getLyric($param){
$query = new MongoDB\Driver\Query($param,['projection'=>['_id' => 0],'limit'=>100]);
$cursor = $this->manager->executeQuery('luoo.lyrics', $query);
return $cursor->toArray();
}
public function vol(int $vol){
$query = new MongoDB\Driver\Query(['vol'=>$vol], ['projection'=>['_id' => 0],'limit'=>1]);
$cursor = $this->manager->executeQuery('luoo.vols', $query);
$result = ['code'=>200];
$result['data'] = current($cursor->toArray());
if($result['data'] && $result['data']->id){
$volId = $result['data']->id;
$result['data']->lyrics = $this->getLyric(['volId'=>$volId]);
}
echo json_encode($result);
}
public function vols(int $date){
$page = $_GET['page']??1;
$where = ['vol'=>['$gte'=>$date]];
$options = ['projection'=>['_id' => 0],'limit'=>10,'sort'=>['vol' => 1]];
if($page>1) $options['skip'] = ($page-1)*10;
$count = $this->getCount('singles',$where);
$query = new MongoDB\Driver\Query($where, $options);
$cursor = $this->manager->executeQuery('luoo.vols', $query);
$result = ['code'=>200];
$result['page'] = $page;
$result['total'] = $count;
$result['data'] = $cursor->toArray();
echo json_encode($result);
}
public function single(int $date){
$query = new MongoDB\Driver\Query(['date'=>$date],['projection'=>['_id' => 0],'limit'=>1]);
$cursor = $this->manager->executeQuery('luoo.singles', $query);
$result = ['code'=>200];
$result['data'] = current($cursor->toArray());
if($result['data'] && $result['data']->id){
$result['data']->lyrics = $this->getLyric(['type'=>1,'date'=>$date]);
}
echo json_encode($result);
}
public function singles(int $date){
$page = $_GET['page']??1;
$where = ['date'=>['$gte'=>$date]];
$options = ['projection'=>['_id' => 0],'limit'=>10,'sort'=>['date' => 1]];
if($page>1) $options['skip'] = ($page-1)*10;
$count = $this->getCount('singles',$where);
$query = new MongoDB\Driver\Query($where, $options);
$cursor = $this->manager->executeQuery('luoo.singles', $query);
$result = ['code'=>200];
$result['page'] = $page;
$result['total'] = $count;
$result['data'] = $cursor->toArray();
echo json_encode($result);
}
public function article(int $id){
$query = new MongoDB\Driver\Query(['id'=>$id], ['projection'=>['_id' => 0],'limit'=>1]);
$cursor = $this->manager->executeQuery('luoo.articles', $query);
$result = ['code'=>200];
$result['data'] = current($cursor->toArray());
if($result['data'] && $result['data']->id){
$articleId = $result['data']->id;
$result['data']->lyrics = $this->getLyric(['articleId'=>$articleId]);
}
echo json_encode($result);
}
public function latest(string $type){
switch (strtolower($type)) {
case 'vol':
$this->vol($this->config['latestVol']);
break;
case 'single':
$this->single($this->config['latestSingle']);
break;
case 'article':
$this->article($this->config['latestArticle']);
break;
default:
echo json_encode(['code'=>'400','msg'=>'允许的 type 为 vol 或 single 或 article']);
break;
}
}
}
try {
$LUOO = new Luoo();
$LUOO->{$router[0]}($router[1]);
}
catch (TypeError $ex) { exit(json_encode(['code'=>'400','msg'=>'请求参数有误']));}
catch (Error $ex) { exit(json_encode(['code'=>'500','msg'=>'服务器内部错误']));}
API列表如下:
/vol/<volIndex>
根据期刊数来获取期刊数据, /vol/717
/vols/<volIndex>
根据当前期刊数来获取该期刊之后的所有新的期刊数据, 如 /vols/926 /single/<singleDate>
根据发布日期来获取单曲数据, 如 /single/20160722
/singles/<singleDate>
根据当前发布日期来获取该发布日期之后的所有新的单曲数据, 如 /singles/20170628 /article/<articleIndex>
根据文章id来获取文章数据, 如 /article/922 /latest/<type>
获取最新的期刊或单曲或文章, 允许的 type 为 vol 或 single 或 article, 如 /latest/vol
来源地址: https://www.cnblogs.com/edit/p/10880194.html
落网数据库简单查询接口 caddy+php7+mongodb的更多相关文章
- Spring Data JPA 简单查询--接口方法
一.接口方法整理速查 下表针对于简单查询,即JpaRepository接口(继承了CrudRepository接口.PagingAndSortingRepository接口)中的可访问方法进行整理.( ...
- Spring Data JPA简单查询接口方法速查
下表针对于简单查询,即JpaRepository接口(继承了CrudRepository接口.PagingAndSortingRepository接口)中的可访问方法进行整理.(1)先按照功能进行分类 ...
- 2018-08-24 中文代码之Spring Boot对H2数据库简单查询
续前文: 中文代码之Spring Boot集成H2内存数据库 在词条中添加英文术语域: @Entity public class 词条 { @Id private long id; private S ...
- mysql学习 | LeetCode数据库简单查询练习
力扣:https://leetcode-cn.com/ 力扣网数据库练习:https://leetcode-cn.com/problemset/database/ 文章目录 175. 组合两个表 题解 ...
- MySQL数据库简单查询
--黑马程序员 DQL数据查询语言 数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端.查询返回的结果集是一张虚拟表. 查询关键字:SELECT 语法: SELECT 列名 FRO ...
- 数据库 简单查询 Sql Server 学生表 课程表 选课表
创建教材中的三张表格,并输入相应的数据 Create table student( Sno char(9), Same char(20), Ssex char(2), Sage smallint, S ...
- Oracle 数据库 简单查询
select DISTINCT dept_id from s_emp; desc s_emp; ; --给入职3年以上员工发10万元年终奖 ; --列出职位是仓库管理员的名字和工资 select la ...
- 在MongoDB数据库中查询数据(上)
在MongoDB数据库中查询数据(上) 在MongoDB数据库中,可以使用Collection对象的find方法从一个集合中查询多个数据文档,find方法使用方法如下所示: collection.fi ...
- 前端笔记之NodeJS(四)MongoDB数据库&Mongoose&自制接口&MVC架构思想|实战
一.MongoDB数据库 1.1 NoSQL简介 随着互联网web2.0网站的兴起,传统的SQL数据库(关系数据库)在应付web2.0网站,特别是超大规模和高并发的SNS(social network ...
随机推荐
- MySQL数据分析-(15)表补充:存储引擎
大家好,我是jacky,很高兴继续跟大家分享<MySQL数据分析实战>,今天跟大家分享的主题是表补充之存储引擎: 我们之前学了跟表结构相关的一些操作,那我们看一下创建表的SQL模型: 在我 ...
- 二十、网络ifconfig 、ip 、netstat、ss之二
ip 网络层协议 ip地址 点分十进制分为4段,范围 0-255 ip分类 A 占据1段,最左侧一段第一位固定为0 0 000 0000 - 0 111 1111 0 - 127:其中0为网络,12 ...
- ACM之路(12)—— KMP & 扩展KMP & Manacher
最近做完了kuangbin的一套关于kmp的题目(除了一道字典树的不会,因为还没学字典树所以先放放),做个总结.(kuangbin题目的链接:http://acm.hust.edu.cn/vjudge ...
- Git生成本机SSH Key并添加到GitHub中
1.检查电脑里是否有SSH Key 打开git Bash客户端 cd ~/.ssh ls 如果有就会输出下面内容 config id_rsa id_rsa.pub known_hosts 2.创建 邮 ...
- Elasticsearch的Search详解
介绍 ES不是新技术,是将全文检索和数据分析.分布式整合到一起. 基于lucene开发,提供简单的restful api接口.java api接口.其他语言开发接口等. 实现了分布式的搜索引擎和分析引 ...
- AcFun 的视频架构演化实践——阅读心得
视频的核心技术栈 AcFun 弹幕视频网(acfun.tv)是中国最早上线的弹幕视频网站,也是最具影响力的弹幕视频平台.“AcFun”原取意于“AnimeComic Fun”.自2007年6月6日成立 ...
- Javascript中数组查重的方法总结大全
数组查重:简单点说,就是找出数组中重复的元素然后去除,最后得到一个没有重复元素的数组. // 方法一思路: 1.构建一个新的数组,用于存放结果. 2.for循环中每次从数组取出一个 ...
- Geth安装和使用
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u011680118/article/details/82378509 一.简介 Geth是Go ...
- SQL-W3School-高级:SQL 数据类型
ylbtech-SQL-W3School-高级:SQL 数据类型 1.返回顶部 1. Microsoft Access.MySQL 以及 SQL Server 所使用的数据类型和范围. Microso ...
- 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_18-CMS前端页面查询开发-页面原型-创建页面和定义路由
module下创建cms目录,里面存cms模块相关的页面 在cms下创建api和components目录,components下放的就是组件. 这个组件刚才介绍的base的下的组件不一样.base下的 ...