基于php的个人博客系统的实现什么是函数?刚刚考完数学没多久的我,脑力里立马想到的是自变量基于html5和css3做的个人博客
2022-12-31
什么是函数? 数学考完不久,我立马想到了自变量、因变量、函数值,即y=f(x)。 当然,在计算机中,函数往往是指定义好的代码程序。 我们可以通过传递参数来调用这个定义好的函数来实现我们需要的功能。 那么,今天的函数计算FC是什么?
在当前云计算时代,容器化技术和各种工具的发展,对开发运维进行了全新的统筹。 开发者完成代码编写后,可以直接提交到各种流水线,无需考虑环境。 可以完成微服务的测试、开发、部署、项目搭建,环境的打包可以由容器来完成。 但是很多时候我们还是需要把精力放在业务上线的集群上。 它是私有云环境还是公共云? 是裸机服务器还是云实例ECS? 是自购还是租赁?
当然,服务器\集群的落地和运维都需要耗费大量的资源和精力。 这是一条捷径,但不是唯一的出路。 因此,函数计算FC的出现带来了架构,让开发者在开发部署时不再有复杂部署服务的感觉,对服务端没有任何影响基于php的个人博客系统的实现,让开发者真正专注于自己的代码。 优越的。 阿里云函数式极简编程,可以专注于业务创新,无采购和部署成本,提供完整的监控、告警等可观察性能力。 函数计算是一种事件驱动的全托管计算服务。 服务器的运维管理真的不用考虑。 您只需要上传开发的代码。 函数计算将通过角色策略规划计算资源,灵活执行函数,最终实现高效。 执行部署。 优雅!
会有那些适用场景? 是人吗? 还是生产?所以这次我会部署两个不同方向的应用来评估
1.通知系统和触发器和聊天机器人。 推送功能涉及到很多系统,如邮件、短信、. 当然,能力不仅仅是信息通知,这里所说的通知功能必须需要基础设施,即服务器来支持运行。 如果直接操作这些功能,我们就不需要支付服务器的运维费用,节省了很多工作量。 收费。 同样,我们可以使用事件驱动模型来实现定时自动触发任务,自动签到,自动发送。
第二,其次,当然是Web类的应用。 基于各种web框架的应用部署,基于Java、PHP等语言搭建站点 ,很容易在线实现这样的博客应用。 配合其他云产品、OSS、RDS等,可以实现高可用、高性能的Web应用,比如Kod官方的云盘系统。
1.用于实现B站日常登录签到
作为b站的老用户,b站的水平无疑是一张妥妥的“名片”。 当然,我已经是六级boss的一员了。 b站升级所需的经验值是关键。 登录、投币、观看都会积累经验。 为了快速升级,这次我会使用阿里云实现b站的日常登录体验Get,看视频体验Get,看直播银瓜子Get(卖淫的直播礼物道具),配合钉钉机器人实现消息推送。
1.创建服务和功能
进入函数计算FC控制台,选择【服务和函数】,点击【创建服务】
在【创建服务】页面,输入服务名称网站优化,选择开启日志功能。 日志可以帮助我们更好的排查错误
这里当然要标注服务的功能,即实现的日常登录签到。
进入【 】页面,选择【Use to from 】
配置函数名,运行环境选择为,选择从文件夹上传代码。
注意这里如果有依赖包需要提前下载到代码包中。 这里需要用到包,需要执行 pip -t 。 本地。不过也可以稍后在控制台执行下载命令
这里函数实现的脚本是定时触发类型,所以我们选择请求处理类型为【 】
下面配置触发器,选择定时触发器,输入名称,选择【指定时间】。 这里我选择每天23:00运行脚本
脚本内容
# -*- coding: utf8 -*-
import requests
import json
import time
import re
import sys
import codecs
from bs4 import BeautifulSoup
from json.decoder import JSONDecodeError
# B站登陆Cookie
cookie = ""
# Webhook地址
webhook = "https://oapi.dingtalk.com/robot/send?access_token=xxxx"
# 自动观看的BV号,杰伦新专-最伟大的作品
bid = 'BV1ua411p7iA'
uid=re.match('(?<=DedeUserID=).*?(?=;)',cookie)
sid=re.match('(?<=sid=).*?(?=;)',cookie)
csrf=re.match('(?<=bili_jct=).*',cookie)
# 部分编码问题
sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())
# bv转为av
def bv_to_av(bv):
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36',
}
r = requests.get('https://api.bilibili.com/x/web-interface/view', {'bvid': bv}, headers=headers)
response = decode_json(r)
try:
return str(response['data']['aid'])
except (KeyError, TypeError):
return '883409884'
# json解析
def decode_json(r):
try:
response = r.json()
except JSONDecodeError:
return -1
else:
return response
# 自定义钉钉机器人推送
def pushinfo(info,specific):
# 定义推送内容,格式参考https://open.dingtalk.com/document/group/message-types-and-data-format
# 注意机器人的关键词
data = {
"msgtype": "text",
"text": {
"title":"Taoreset",
"content": "【Taoreset-Serverless推送】\n"+info+specific
}
}
headers = {'content-type': 'application/json'} # 请求头
r = requests.post(webhook, headers=headers, data=json.dumps(data))
r.encoding = 'utf-8'
print (r.text)
# 阿b登录,得登陆经验
def login():
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36',
'Cookie':cookie
}
response = requests.session().get('http://api.bilibili.com/x/space/myinfo',headers=headers)
rejson = json.loads(response.text)
code = rejson['code']
msg = rejson['message']
if code == 0:
print('登录成功')
return True
else:
print('登录失败:'+msg)
return False
# 获取用户信息
def get_user_info():
headers = {
'Cookie':cookie
}
response = requests.session().get('http://api.bilibili.com/x/space/myinfo?jsonp=jsonp',headers=headers)
rejson = json.loads(response.text)
code = rejson['code']
msg = rejson['message']
if code == 0:
userInfo=['账号:'+str(rejson['data']['silence']),
'硬币:'+str(rejson['data']['coins']),
'经验:'+str(rejson['data']['level_exp']['current_exp'])+"/"+str(rejson['data']['level_exp']['next_exp']),
'等级:'+str(rejson['data']['level']),
'昵称:'+str(rejson['data']['name'])
]
print(userInfo[0])
print (userInfo[1])
print(userInfo[2])
print(userInfo[3])
print(userInfo[4])
return userInfo
else:
print("用户信息获取失败:"+msg)
return "用户信息获取失败:"+msg
# 直播签到,赚银瓜子儿
def do_sign():
headers = {
'Cookie':cookie
}
response = requests.session().get('https://api.live.bilibili.com/sign/doSign',headers=headers)
rejson = json.loads(response.text)
code = rejson['code']
msg = rejson['message']
if code == 0:
print('直播签到成功!')
return True
else:
print("直播签到失败:"+msg)
return False
# 看BV号视频,得观看经验
def watch():
aid=bv_to_av(bid)
headers = {
'Cookie':cookie
}
response = requests.session().get('http://api.bilibili.com/x/web-interface/view?aid='+str(aid),headers=headers)
rejson = json.loads(response.text)
code = rejson['code']
#print(response.text)
if code == 0:
cid = rejson['data']['cid']
duration = rejson['data']['duration']
else:
print('视频信息解析失败')
return False
payload = {
'aid': aid,
'cid': cid,
'jsonp': "jsonp",
'mid': uid,
'csrf': csrf,
'played_time': 0,
'pause': False,
'realtime': duration,
'dt': 7,
'play_type': 1,
'start_ts': int(time.time()),
}
response = requests.session().post('http://api.bilibili.com/x/report/web/heartbeat',data=payload,headers=headers)
rejson = json.loads(response.text)
code = rejson['code']
if code == 0:
time.sleep(5)
payload['played_time'] = duration - 1
payload['play_type'] = 0
payload['start_ts'] = int(time.time())
response = requests.session().post('http://api.bilibili.com/x/report/web/heartbeat',data=payload,headers=headers)
rejson = json.loads(response.text)
code = rejson['code']
if code == 0:
print(f"av{aid}观看成功")
return True
print(f"av{aid}观看失败 {response}")
return False
def main(*args):
if login():
ui = get_user_info()
desp='直播签到:'+str(do_sign())+'\n\n'+'观看视频:'+str(watch())+'\n\n'+ui[0]+'\n\n'+ui[1]+'\n\n'+ui[2]+'\n\n'+ui[3]+'\n\n'+ui[4]+'\n\n'
pushinfo('哔哩哔哩签到成功',desp)
else:
pushinfo('哔哩哔哩签到失败','')
if __name__ == '__main__':
main()
2.修改功能配置
创建函数后,会进入函数管理界面。 这里的功能代码展示的是我们上传的代码文件,所有代码执行的本地路径都在/code目录下。
如果有依赖模块提示,也可以在下面的控制台终端输入命令完成模块的安装和下载。 工作目录下所有代码修改完成后,需要点击 Code进行部署上传。
点-t.bs4
对于其余的,您需要修改功能的配置。 点击【功能配置】,找到【环境信息】进行编辑,修改【 】,修改功能入口。 我这里的脚本文件名是.py,代码中的main函数是main,所以函数入口是
3.完成功能功能测试
选择【测试功能】立即触发功能,点击测试功能进行测试
测试完成后会在下方显示日志输出内容,方便查看结果和排查问题
完成效果,触发23点定时准时完成签到,钉钉机器人推送消息
嘿嘿,一起跑剧本,早日迎来B站六级会员! ! !
脚本参考,由
2、农产品电商网站云化改造
这里我以隔壁软件专业(本人是网络技术专业)的一个大作业项目作为部署案例。 项目非常简单,功能单一,但也是一个非常经典的前后端分离项目。 由于本人不太擅长开发,所以项目具体技术就不难看了。 据说有版权,就不放源码了hhhh
改造前相信是很多中小腾云网络业务的经典架构,将业务涉及的所有服务中间件运行在一台服务器/虚拟机上,虽然现在可能完全是实验室环境,但是在事实上,还有很多项目是这样做的。 劣势不用多说,部署维护困难,资源难以扩展,后续改造复杂,没有应用高可用技术性能差等等。
云上农产品电商平台,项目比较简单,同区域规划。 主要是前端的HTML页面和后端的Jar包分别由两个独立的函数来完成运行计算。 其余的配套服务都是通过相应的云产品在云端实现的。 由于我已经在自己的ECS上运行服务,不再需要单独购买云数据库版本。 当然还是推荐使用阿里云的云数据库产品。
1.服务创建
进入函数计算控制台,选择【服务与函数】,点击【创建服务】
输入要创建的服务的名称和描述,开启日志功能,点击确定完成服务的创建
服务创建完成后,进入【服务详情】,找到【网络配置】,点击【编辑】
选择 to VPC,选择 ,选择VPC, , ,这里需要和其他支持的云产品(数据库等)保持在同一个VPC下。 因此,需要在云端规划网络,查看该地区的产品是否有货。
2.前端页面功能创建
服务创建完成后seo优化,点击【创建函数】进入函数创建页面
选择【Use 】,输入函数名,运行环境选择【】,上传前端html代码和配置文件,监听端口选择80,即原中间件的服务端口.
创建函数后,进入函数详情界面,可以在函数代码中编辑修改代码。 代码更改后,需要点击 Code重新上传。 上面说了服务配置需要一起上传,还有一个/etc//mime. 需要将文件复制到当前目录,以避免 mime 文件类型映射错误。
把关键的配置放在这里,根据自己的业务情况修改,注意配置中的端口监听需要和函数创建监听端口保持一致,网页代码的路径设置为/code
http {
include mime.types; #注意引入此文件
keepalive_timeout 900;
server {
listen 80;
server_name localhost;
location / {
root /code;
index index.html index.htm;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /users {
proxy_pass http://serverless.后端函数访问地址.run;
#Nginx反代传给后端的函数,地址在后续后端函数创建完可以拷贝
}
location /items {
proxy_pass http://serverless.后端函数访问地址.run;
#Nginx反代传给后端的函数,地址在后续后端函数创建完可以拷贝
}
可以在通话记录中查询相关日志
当函数被触发运行时,实例会根据访问请求自动启动。 在这里,您可以手动登录实例查看中间件服务和运行环境的日志,并进行故障排查。
3.后台功能创建
回到函数服务界面,再次点击【创建函数】,进入函数创建页面
选择【使用自定义运行时平滑迁移】,输入函数名,运行环境选择【Java】,上传打包好的Jar包文件。
根据具体业务修改【启动命令】和【监听端口】。 这里我需要监听的业务端口为8080,运行时需要传入数据库连接的参数。 这里配置的数据库源用户名和密码连接地址会在后续的云数据库RDS中设置。
后台功能创建完成后,进入功能详情界面,其余功能与上述前端功能相同,不再赘述
点击【触发器管理】,其中HTTP触发器提供公网和内网访问地址,我们复制内网地址基于php的个人博客系统的实现,在前端中间件反向生成配置中填写这个域名,实现前端访问和后端触发-结束功能
4.云数据库RDS创建及迁移导入
原有的架构并没有做到数据库服务的独立性和高可用。 在本次云部署中,我们将使用阿里云公测中的云数据库版本。 RDS提供了CPU和内存的实时弹性能力,具有资源占用低、易用、灵活、价格低廉等优点。 合理优化使用成本,进一步降本增效。
RDS实例创建
进入云数据库RDS控制台,点击【创建实例】开始实例创建过程,在【基础资源】设置界面选择版本,其余根据实际情况选择
【实例配置】创建RDS时,需要注意网络VPC的设置,必须与服务设置的VPC一致,才能实现内网数据互通。确定顺序后,等待实例上线即可被创造
RDS数据库用户设置
创建实例后,选择管理实例。 选择左侧任务栏【账户管理】,点击【创建账户】创建数据库账户,连接供应商平台后台。
输入账户名和密码,选择普通账户,点击确定完成用户创建
RDS业务数据库创建
选择左侧栏的【数据库管理】,选择【创建数据库】
输入农产品电商业务所需的库名,并将账号授权给上一步设置的用户,点击创建完成库设置。
RDS服务连接地址
我们函数中需要连接的库的地址可以在rds实例中的【数据库】连接处找到,但是需要提前设置好白名单。
我们复制内网地址,同样完成连接用户、密码、库的配置,然后我们就可以在函数或者后台代码中配置了
RDS业务数据库的导入与恢复
数据库上云的关键是数据内容的迁移。 本次部署的业务数据库少且小,迁移方式采用简单的备份SQL脚本文件。 /的数据导出方式有很多种,可以根据实际需要进行备份导出。 当然,大型业务数据库也有专门的备份和迁移工具,这里不再赘述。
进入DMS数据管理服务,选择【数据库开发】,点击【数据变更】下的【数据导入】。
根据具体的备份方式导入数据库。 这里我选择上传备份sql脚本,提交申请开始导入数据。
数据导入完成,数据迁移完成
5、服务云和静态资源CDN
上一篇文章提到,由于我已经在自己的ECS上运行服务,所以不再需要单独购买云数据库版本。 ECS也在同一个VPC下,可以实现内网互通。 当然还是推荐使用阿里云的云数据库产品。
静态资源的CDN,包括css\js\的加速,在阿里的CDN服务上,在原有的架构中已经有了,这里就不做改动了。
6.公网业务访问域名配置
最后一步,用户最终访问了前端功能。 正如阿里云给出的提示,访问默认公网地址不会进行任何中间件解析,而是直接下载首页html静态文件,所以需要我们自己配置访问域名。
返回函数计算控制台,选择【域名管理】,点击【添加自定义域名】
输入自定义域名,配置路由,选择对应功能的服务名、功能名、版本号(最新)
复制需要解析的值
复制记录值,点击【云解析DNS控制台】,进入解析设置,点击【添加记录】
选择记录类型【】,输入主机头,填写复制的记录值,确认完成添加
七、农产品电商项目上云效果