基于php的個(gè)人博客系統(tǒng)的實(shí)現(xiàn)什么是函數(shù)?剛剛考完數(shù)學(xué)沒多久的我,腦力里立馬想到的是自變量基于html5和css3做的個(gè)人博客
2022-12-31
什么是函數(shù)? 數(shù)學(xué)考完不久,我立馬想到了自變量、因變量、函數(shù)值,即y=f(x)。 當(dāng)然,在計(jì)算機(jī)中,函數(shù)往往是指定義好的代碼程序。 我們可以通過傳遞參數(shù)來調(diào)用這個(gè)定義好的函數(shù)來實(shí)現(xiàn)我們需要的功能。 那么,今天的函數(shù)計(jì)算FC是什么?
在當(dāng)前云計(jì)算時(shí)代,容器化技術(shù)和各種工具的發(fā)展,對開發(fā)運(yùn)維進(jìn)行了全新的統(tǒng)籌。 開發(fā)者完成代碼編寫后,可以直接提交到各種流水線,無需考慮環(huán)境。 可以完成微服務(wù)的測試、開發(fā)、部署、項(xiàng)目搭建,環(huán)境的打包可以由容器來完成。 但是很多時(shí)候我們還是需要把精力放在業(yè)務(wù)上線的集群上。 它是私有云環(huán)境還是公共云? 是裸機(jī)服務(wù)器還是云實(shí)例ECS? 是自購還是租賃?
當(dāng)然,服務(wù)器\集群的落地和運(yùn)維都需要耗費(fèi)大量的資源和精力。 這是一條捷徑,但不是唯一的出路。 因此,函數(shù)計(jì)算FC的出現(xiàn)帶來了架構(gòu),讓開發(fā)者在開發(fā)部署時(shí)不再有復(fù)雜部署服務(wù)的感覺,對服務(wù)端沒有任何影響基于php的個(gè)人博客系統(tǒng)的實(shí)現(xiàn),讓開發(fā)者真正專注于自己的代碼。 優(yōu)越的。 阿里云函數(shù)式極簡編程,可以專注于業(yè)務(wù)創(chuàng)新,無采購和部署成本,提供完整的監(jiān)控、告警等可觀察性能力。 函數(shù)計(jì)算是一種事件驅(qū)動的全托管計(jì)算服務(wù)。 服務(wù)器的運(yùn)維管理真的不用考慮。 您只需要上傳開發(fā)的代碼。 函數(shù)計(jì)算將通過角色策略規(guī)劃計(jì)算資源,靈活執(zhí)行函數(shù),最終實(shí)現(xiàn)高效。 執(zhí)行部署。 優(yōu)雅!
會有那些適用場景? 是人嗎? 還是生產(chǎn)?所以這次我會部署兩個(gè)不同方向的應(yīng)用來評估
1.通知系統(tǒng)和觸發(fā)器和聊天機(jī)器人。 推送功能涉及到很多系統(tǒng),如郵件、短信、. 當(dāng)然,能力不僅僅是信息通知,這里所說的通知功能必須需要基礎(chǔ)設(shè)施,即服務(wù)器來支持運(yùn)行。 如果直接操作這些功能,我們就不需要支付服務(wù)器的運(yùn)維費(fèi)用,節(jié)省了很多工作量。 收費(fèi)。 同樣,我們可以使用事件驅(qū)動模型來實(shí)現(xiàn)定時(shí)自動觸發(fā)任務(wù),自動簽到,自動發(fā)送。
第二,其次,當(dāng)然是Web類的應(yīng)用。 基于各種web框架的應(yīng)用部署,基于Java、PHP等語言搭建站點(diǎn) ,很容易在線實(shí)現(xiàn)這樣的博客應(yīng)用。 配合其他云產(chǎn)品、OSS、RDS等,可以實(shí)現(xiàn)高可用、高性能的Web應(yīng)用,比如Kod官方的云盤系統(tǒng)。
1.用于實(shí)現(xiàn)B站日常登錄簽到
作為b站的老用戶,b站的水平無疑是一張妥妥的“名片”。 當(dāng)然,我已經(jīng)是六級boss的一員了。 b站升級所需的經(jīng)驗(yàn)值是關(guān)鍵。 登錄、投幣、觀看都會積累經(jīng)驗(yàn)。 為了快速升級,這次我會使用阿里云實(shí)現(xiàn)b站的日常登錄體驗(yàn)Get,看視頻體驗(yàn)Get,看直播銀瓜子Get(賣淫的直播禮物道具),配合釘釘機(jī)器人實(shí)現(xiàn)消息推送。
1.創(chuàng)建服務(wù)和功能
進(jìn)入函數(shù)計(jì)算FC控制臺,選擇【服務(wù)和函數(shù)】,點(diǎn)擊【創(chuàng)建服務(wù)】
在【創(chuàng)建服務(wù)】頁面,輸入服務(wù)名稱網(wǎng)站優(yōu)化,選擇開啟日志功能。 日志可以幫助我們更好的排查錯(cuò)誤
這里當(dāng)然要標(biāo)注服務(wù)的功能,即實(shí)現(xiàn)的日常登錄簽到。
進(jìn)入【 】頁面,選擇【Use to from 】
配置函數(shù)名,運(yùn)行環(huán)境選擇為,選擇從文件夾上傳代碼。
注意這里如果有依賴包需要提前下載到代碼包中。 這里需要用到包,需要執(zhí)行 pip -t 。 本地。不過也可以稍后在控制臺執(zhí)行下載命令
這里函數(shù)實(shí)現(xiàn)的腳本是定時(shí)觸發(fā)類型,所以我們選擇請求處理類型為【 】
下面配置觸發(fā)器,選擇定時(shí)觸發(fā)器,輸入名稱,選擇【指定時(shí)間】。 這里我選擇每天23:00運(yùn)行腳本
腳本內(nèi)容
# -*- 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轉(zhuǎn)為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
# 自定義釘釘機(jī)器人推送
def pushinfo(info,specific):
# 定義推送內(nèi)容,格式參考https://open.dingtalk.com/document/group/message-types-and-data-format
# 注意機(jī)器人的關(guān)鍵詞
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登錄,得登陸經(jīng)驗(yàn)
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('登錄失?。?#39;+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']),
'經(jīng)驗(yàn):'+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號視頻,得觀看經(jīng)驗(yàn)
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.修改功能配置
創(chuàng)建函數(shù)后,會進(jìn)入函數(shù)管理界面。 這里的功能代碼展示的是我們上傳的代碼文件,所有代碼執(zhí)行的本地路徑都在/code目錄下。
如果有依賴模塊提示,也可以在下面的控制臺終端輸入命令完成模塊的安裝和下載。 工作目錄下所有代碼修改完成后,需要點(diǎn)擊 Code進(jìn)行部署上傳。
點(diǎn)-t.bs4
對于其余的,您需要修改功能的配置。 點(diǎn)擊【功能配置】,找到【環(huán)境信息】進(jìn)行編輯,修改【 】,修改功能入口。 我這里的腳本文件名是.py,代碼中的main函數(shù)是main,所以函數(shù)入口是
3.完成功能功能測試
選擇【測試功能】立即觸發(fā)功能,點(diǎn)擊測試功能進(jìn)行測試
測試完成后會在下方顯示日志輸出內(nèi)容,方便查看結(jié)果和排查問題
完成效果,觸發(fā)23點(diǎn)定時(shí)準(zhǔn)時(shí)完成簽到,釘釘機(jī)器人推送消息
嘿嘿,一起跑劇本,早日迎來B站六級會員! ! !
腳本參考,由
2、農(nóng)產(chǎn)品電商網(wǎng)站云化改造
這里我以隔壁軟件專業(yè)(本人是網(wǎng)絡(luò)技術(shù)專業(yè))的一個(gè)大作業(yè)項(xiàng)目作為部署案例。 項(xiàng)目非常簡單,功能單一,但也是一個(gè)非常經(jīng)典的前后端分離項(xiàng)目。 由于本人不太擅長開發(fā),所以項(xiàng)目具體技術(shù)就不難看了。 據(jù)說有版權(quán),就不放源碼了hhhh
改造前相信是很多中小騰云網(wǎng)絡(luò)業(yè)務(wù)的經(jīng)典架構(gòu),將業(yè)務(wù)涉及的所有服務(wù)中間件運(yùn)行在一臺服務(wù)器/虛擬機(jī)上,雖然現(xiàn)在可能完全是實(shí)驗(yàn)室環(huán)境,但是在事實(shí)上,還有很多項(xiàng)目是這樣做的。 劣勢不用多說,部署維護(hù)困難,資源難以擴(kuò)展,后續(xù)改造復(fù)雜,沒有應(yīng)用高可用技術(shù)性能差等等。
云上農(nóng)產(chǎn)品電商平臺,項(xiàng)目比較簡單,同區(qū)域規(guī)劃。 主要是前端的HTML頁面和后端的Jar包分別由兩個(gè)獨(dú)立的函數(shù)來完成運(yùn)行計(jì)算。 其余的配套服務(wù)都是通過相應(yīng)的云產(chǎn)品在云端實(shí)現(xiàn)的。 由于我已經(jīng)在自己的ECS上運(yùn)行服務(wù),不再需要單獨(dú)購買云數(shù)據(jù)庫版本。 當(dāng)然還是推薦使用阿里云的云數(shù)據(jù)庫產(chǎn)品。
1.服務(wù)創(chuàng)建
進(jìn)入函數(shù)計(jì)算控制臺,選擇【服務(wù)與函數(shù)】,點(diǎn)擊【創(chuàng)建服務(wù)】
輸入要創(chuàng)建的服務(wù)的名稱和描述,開啟日志功能,點(diǎn)擊確定完成服務(wù)的創(chuàng)建
服務(wù)創(chuàng)建完成后,進(jìn)入【服務(wù)詳情】,找到【網(wǎng)絡(luò)配置】,點(diǎn)擊【編輯】
選擇 to VPC,選擇 ,選擇VPC, , ,這里需要和其他支持的云產(chǎn)品(數(shù)據(jù)庫等)保持在同一個(gè)VPC下。 因此,需要在云端規(guī)劃網(wǎng)絡(luò),查看該地區(qū)的產(chǎn)品是否有貨。
2.前端頁面功能創(chuàng)建
服務(wù)創(chuàng)建完成后seo優(yōu)化,點(diǎn)擊【創(chuàng)建函數(shù)】進(jìn)入函數(shù)創(chuàng)建頁面
選擇【Use 】,輸入函數(shù)名,運(yùn)行環(huán)境選擇【】,上傳前端html代碼和配置文件,監(jiān)聽端口選擇80,即原中間件的服務(wù)端口.
創(chuàng)建函數(shù)后,進(jìn)入函數(shù)詳情界面,可以在函數(shù)代碼中編輯修改代碼。 代碼更改后,需要點(diǎn)擊 Code重新上傳。 上面說了服務(wù)配置需要一起上傳,還有一個(gè)/etc//mime. 需要將文件復(fù)制到當(dāng)前目錄,以避免 mime 文件類型映射錯(cuò)誤。
把關(guān)鍵的配置放在這里,根據(jù)自己的業(yè)務(wù)情況修改,注意配置中的端口監(jiān)聽需要和函數(shù)創(chuàng)建監(jiān)聽端口保持一致,網(wǎng)頁代碼的路徑設(shè)置為/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.后端函數(shù)訪問地址.run;
#Nginx反代傳給后端的函數(shù),地址在后續(xù)后端函數(shù)創(chuàng)建完可以拷貝
}
location /items {
proxy_pass http://serverless.后端函數(shù)訪問地址.run;
#Nginx反代傳給后端的函數(shù),地址在后續(xù)后端函數(shù)創(chuàng)建完可以拷貝
}
可以在通話記錄中查詢相關(guān)日志
當(dāng)函數(shù)被觸發(fā)運(yùn)行時(shí),實(shí)例會根據(jù)訪問請求自動啟動。 在這里,您可以手動登錄實(shí)例查看中間件服務(wù)和運(yùn)行環(huán)境的日志,并進(jìn)行故障排查。
3.后臺功能創(chuàng)建
回到函數(shù)服務(wù)界面,再次點(diǎn)擊【創(chuàng)建函數(shù)】,進(jìn)入函數(shù)創(chuàng)建頁面
選擇【使用自定義運(yùn)行時(shí)平滑遷移】,輸入函數(shù)名,運(yùn)行環(huán)境選擇【Java】,上傳打包好的Jar包文件。
根據(jù)具體業(yè)務(wù)修改【啟動命令】和【監(jiān)聽端口】。 這里我需要監(jiān)聽的業(yè)務(wù)端口為8080,運(yùn)行時(shí)需要傳入數(shù)據(jù)庫連接的參數(shù)。 這里配置的數(shù)據(jù)庫源用戶名和密碼連接地址會在后續(xù)的云數(shù)據(jù)庫RDS中設(shè)置。
后臺功能創(chuàng)建完成后,進(jìn)入功能詳情界面,其余功能與上述前端功能相同,不再贅述
點(diǎn)擊【觸發(fā)器管理】,其中HTTP觸發(fā)器提供公網(wǎng)和內(nèi)網(wǎng)訪問地址,我們復(fù)制內(nèi)網(wǎng)地址基于php的個(gè)人博客系統(tǒng)的實(shí)現(xiàn),在前端中間件反向生成配置中填寫這個(gè)域名,實(shí)現(xiàn)前端訪問和后端觸發(fā)-結(jié)束功能
4.云數(shù)據(jù)庫RDS創(chuàng)建及遷移導(dǎo)入
原有的架構(gòu)并沒有做到數(shù)據(jù)庫服務(wù)的獨(dú)立性和高可用。 在本次云部署中,我們將使用阿里云公測中的云數(shù)據(jù)庫版本。 RDS提供了CPU和內(nèi)存的實(shí)時(shí)彈性能力,具有資源占用低、易用、靈活、價(jià)格低廉等優(yōu)點(diǎn)。 合理優(yōu)化使用成本,進(jìn)一步降本增效。
RDS實(shí)例創(chuàng)建
進(jìn)入云數(shù)據(jù)庫RDS控制臺,點(diǎn)擊【創(chuàng)建實(shí)例】開始實(shí)例創(chuàng)建過程,在【基礎(chǔ)資源】設(shè)置界面選擇版本,其余根據(jù)實(shí)際情況選擇
【實(shí)例配置】創(chuàng)建RDS時(shí),需要注意網(wǎng)絡(luò)VPC的設(shè)置,必須與服務(wù)設(shè)置的VPC一致,才能實(shí)現(xiàn)內(nèi)網(wǎng)數(shù)據(jù)互通。確定順序后,等待實(shí)例上線即??可被創(chuàng)造
RDS數(shù)據(jù)庫用戶設(shè)置
創(chuàng)建實(shí)例后,選擇管理實(shí)例。 選擇左側(cè)任務(wù)欄【賬戶管理】,點(diǎn)擊【創(chuàng)建賬戶】創(chuàng)建數(shù)據(jù)庫賬戶,連接供應(yīng)商平臺后臺。
輸入賬戶名和密碼,選擇普通賬戶,點(diǎn)擊確定完成用戶創(chuàng)建
RDS業(yè)務(wù)數(shù)據(jù)庫創(chuàng)建
選擇左側(cè)欄的【數(shù)據(jù)庫管理】,選擇【創(chuàng)建數(shù)據(jù)庫】
輸入農(nóng)產(chǎn)品電商業(yè)務(wù)所需的庫名,并將賬號授權(quán)給上一步設(shè)置的用戶,點(diǎn)擊創(chuàng)建完成庫設(shè)置。
RDS服務(wù)連接地址
我們函數(shù)中需要連接的庫的地址可以在rds實(shí)例中的【數(shù)據(jù)庫】連接處找到,但是需要提前設(shè)置好白名單。
我們復(fù)制內(nèi)網(wǎng)地址,同樣完成連接用戶、密碼、庫的配置,然后我們就可以在函數(shù)或者后臺代碼中配置了
RDS業(yè)務(wù)數(shù)據(jù)庫的導(dǎo)入與恢復(fù)
數(shù)據(jù)庫上云的關(guān)鍵是數(shù)據(jù)內(nèi)容的遷移。 本次部署的業(yè)務(wù)數(shù)據(jù)庫少且小,遷移方式采用簡單的備份SQL腳本文件。 /的數(shù)據(jù)導(dǎo)出方式有很多種,可以根據(jù)實(shí)際需要進(jìn)行備份導(dǎo)出。 當(dāng)然,大型業(yè)務(wù)數(shù)據(jù)庫也有專門的備份和遷移工具,這里不再贅述。
進(jìn)入DMS數(shù)據(jù)管理服務(wù),選擇【數(shù)據(jù)庫開發(fā)】,點(diǎn)擊【數(shù)據(jù)變更】下的【數(shù)據(jù)導(dǎo)入】。
根據(jù)具體的備份方式導(dǎo)入數(shù)據(jù)庫。 這里我選擇上傳備份sql腳本,提交申請開始導(dǎo)入數(shù)據(jù)。
數(shù)據(jù)導(dǎo)入完成,數(shù)據(jù)遷移完成
5、服務(wù)云和靜態(tài)資源CDN
上一篇文章提到,由于我已經(jīng)在自己的ECS上運(yùn)行服務(wù),所以不再需要單獨(dú)購買云數(shù)據(jù)庫版本。 ECS也在同一個(gè)VPC下,可以實(shí)現(xiàn)內(nèi)網(wǎng)互通。 當(dāng)然還是推薦使用阿里云的云數(shù)據(jù)庫產(chǎn)品。
靜態(tài)資源的CDN,包括css\js\的加速,在阿里的CDN服務(wù)上,在原有的架構(gòu)中已經(jīng)有了,這里就不做改動了。
6.公網(wǎng)業(yè)務(wù)訪問域名配置
最后一步,用戶最終訪問了前端功能。 正如阿里云給出的提示,訪問默認(rèn)公網(wǎng)地址不會進(jìn)行任何中間件解析,而是直接下載首頁html靜態(tài)文件,所以需要我們自己配置訪問域名。
返回函數(shù)計(jì)算控制臺,選擇【域名管理】,點(diǎn)擊【添加自定義域名】
輸入自定義域名,配置路由,選擇對應(yīng)功能的服務(wù)名、功能名、版本號(最新)
復(fù)制需要解析的值
復(fù)制記錄值,點(diǎn)擊【云解析DNS控制臺】,進(jìn)入解析設(shè)置,點(diǎn)擊【添加記錄】
選擇記錄類型【】,輸入主機(jī)頭,填寫復(fù)制的記錄值,確認(rèn)完成添加
七、農(nóng)產(chǎn)品電商項(xiàng)目上云效果