前言
Python部署一直是我比较头疼的事,一些PHP制作的API速度也不太理想(受限于服务器),后来突然想起不是有云函数这种东西吗,然后就打算尝试一下看怎么样,这里记录一下我的心得。
我们直接选腾讯云了,因为它的界面操作什么的都比较友好,阿里云过于复杂,我试了一下还是放弃了……
部署一个随机图片API
以喜闻乐见的随机图API为例,熟悉云函数的使用方法。
首先,注册一个腾讯云账号,然后打开云函数,在 函数服务
中点击 新建
,函数名随便取,我这里就填 randompic
了。
点击 下一步
,就进入了主要程序设计,描述什么的都不用改。执行方法的意思,是调用云函数时,会执行 index.php
中的 main_handler
函数,这个也不用改。
往下拉,是代码与文件主界面,这个先不急着改,提一点,云函数执行后,返回的只有 return
的内容,echo
、print
什么的统统不会在浏览器中显示。
最后是高级设置,这个也默认就好,当然如果你需要,也可以增加最大内存使用或超时时间。
最后点击完成,一个云函数服务就创建完毕了。
然后点进去你刚刚创建的服务,编写相应的代码,这里我先创建了一个 acg.txt
文件,然后把图片链接按行复制到文件中以便读取。
代码如下:
<?php
function main_handler($event, $context) {
$pics = [];
$fs = fopen(__DIR__."/acg.txt", "r");
while(!feof($fs)){
$line=trim(fgets($fs));
if($line!=''){
array_push($pics, $line);
}
}
//从数组随机获取链接
$pic = $pics[array_rand($pics)];
return $pic;
}
?>
完成后,点一下代码下方的 保存并测试
,返回结果成功显示出一条连接,说明代码无误。
OK,这样一个简单的随机图API做好了,接下来要定义触发方式,在右侧菜单栏中找到 触发管理
,创建一个触发器,触发方式选择 API网关触发器
,其他默认即可。
然后就会生成一条测试连接,点击下面的访问路径,你就可以看到返回结果啦。
但,这仍不是我们想要的,我们希望访问链接直接给出图片而非链接。遗憾的是,这种效果我也不知道怎么实现,查看了腾讯给的几个模板,包括返回web界面什么的,最终返回的都是一堆代码。我思来想去,或许只能曲线救国,通过在服务器上创建一个php文件,调用这个API来实现了……
如果有大佬知道怎么做的,欢迎评论区留言
代码如下:
<?php
$json = file_get_contents('https://service-qb9jcbjd-1256293391.sh.apigw.tencentcs.com/release/randompic');
$arr = json_decode($json,true);
header("Location:$arr");
?>
Python版本
整完php版本的随机图后,我突然发现自己陷入了一个思维误区,我为什么非要用php,而不选更为熟悉的python呢。然后我又写了一个python版的随机图,代码如下:
# -*- coding: utf8 -*-
import random
def main_handler(event, context):
with open('acg.txt','rb') as handler:
lines = handler.readlines()
result = random.choice(lines).decode('utf-8').strip('\n\r')
#print(result)
return result
这里有两个地方需要注意,一是读取的内容是 bytes
类型,不能直接返回,需要加个 .decode('utf-8')
将其转为str,另外读取时会带有回车换行符,也需要手动去掉。
测试后发现,python版占用的内存居然只需要10m,比php整整少了5倍!不知道是代码问题还是程序本身问题……
绑定域名
云函数的使用界面以及相关的帮助文档都没提到绑定域名这回事,我还以为没有这个功能,后来发了工单才知道原来是在API网关中实现的,具体参考文档见:https://cloud.tencent.com/document/product/628/11791
首先你需要一个备案过的域名,然后打开API网关,在 服务
中找到你想绑定的API网关。
比如我的 yanshu
,点进去,找到 自定义域名
,点击 新建
然后去域名控制台添加相应的CHAME记录,后面的的相信大家都懂。(PS:想要添加HTTPS的同学可以点击证书下面的 点此前往
,然后购买一个免费的证书部署即可)
[scode type="yellow"]我吐了,写完几个函数后发现API网关绑定域名必须在腾讯云备案,算了,老老实实用阿里云了[/scode]
0728更新:
后来我又尝试了百度云,使用起来也挺简单的,不过节点比较少,国内只有三个。至于绑定域名,同样用API网关间接进行,百度云的API网关功能好像更多一些,不过其他功能暂时不在我的考虑范围内。最重要的是,文档上说API网关的运行逻辑与函数计算一样,但是做了一个简单的hello world程序没法正确返回。我以为是我哪里操作失误了,提交工单后才知道,原来是系统本身的问题……不知道是不是用的人少,我发工单后才解决这个bug,现在已经能愉快使用了。
哦对了,暂时来说,百度云的API网关绑定域名,不需要在百度云备案,这点还是不错的。
版权属于:作者名称
本文链接:https://www.sitstars.com/archives/97/
转载时须注明出处及本声明
配置api网关的时候把[是否启用响应集成]设置为启用就可以解析html,应该就能把图片显示出来了
jahew 2020-10-22
谢谢dalao,学到了
雁陎 2020-10-22 回复 @jahew
你才是大佬 ::aru:confuse::
jahew 2020-10-24 回复 @雁陎