客至汲泉烹茶, 抚琴听者知音

腾讯云函数SCF使用心得

前言

Python部署一直是我比较头疼的事,一些PHP制作的API速度也不太理想(受限于服务器),后来突然想起不是有云函数这种东西吗,然后就打算尝试一下看怎么样,这里记录一下我的心得。

我们直接选腾讯云了,因为它的界面操作什么的都比较友好,阿里云过于复杂,我试了一下还是放弃了……

部署一个随机图片API

以喜闻乐见的随机图API为例,熟悉云函数的使用方法。

首先,注册一个腾讯云账号,然后打开云函数,在 函数服务中点击 新建,函数名随便取,我这里就填 randompic了。

点击 下一步,就进入了主要程序设计,描述什么的都不用改。执行方法的意思,是调用云函数时,会执行 index.php中的 main_handler函数,这个也不用改。

往下拉,是代码与文件主界面,这个先不急着改,提一点,云函数执行后,返回的只有 return的内容,echoprint什么的统统不会在浏览器中显示。

最后是高级设置,这个也默认就好,当然如果你需要,也可以增加最大内存使用或超时时间。

最后点击完成,一个云函数服务就创建完毕了。

然后点进去你刚刚创建的服务,编写相应的代码,这里我先创建了一个 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网关绑定域名,不需要在百度云备案,这点还是不错的。

添加新评论取消回复