云函數(shù)SCF中PHP的入門坑有哪些,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
目前成都創(chuàng)新互聯(lián)已為上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、成都網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、丹陽網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
由于云函數(shù) SCF 本身是用 bootstrap.php
來調(diào)用我們的入口函數(shù),默認(rèn)為 index.main\_handler
,意思是調(diào)用 index.php
文件中的 main\_handler()
,所以很多地方寫法要有改變。php 一般提供網(wǎng)頁服務(wù),所以我主要講API 網(wǎng)關(guān)配合的云函數(shù) SCF。
main_handler($event, $context)函數(shù)會(huì)傳入2個(gè)參數(shù),首先這2個(gè)參數(shù)是object,需要用->來訪問子項(xiàng),如 $event->{'headers'} ,不是很方便,我一般轉(zhuǎn)換成數(shù)組:
$event = json_decode(json_encode($event), true);
這樣就比較方便了,如 $event['headers']['host'] 。
大家可以打印這兩個(gè)參數(shù)看一眼里面有些什么。
我們可以從中獲取到很多有用的東西,比如:
$_GET = $event['queryString']; $_POST = $event['body']; $_COOKIE = $event['headers']['cookie'];
在云函數(shù) SCF 中運(yùn)行的 php 程序,因?yàn)闉g覽器是提交給 API 網(wǎng)關(guān),不是提交給 SCF 的,這些超全局變量完全沒有獲取到東西,所以要這樣來獲取。
但我們發(fā)現(xiàn),$event['body']
與 $event['headers']['cookie']
本身是一個(gè)長字符串,里面有好幾個(gè)值,并且里面 url 編碼了,這樣不方便使用,所以做些小操作:
$postbody = explode("&",$event['body']); foreach ($postbody as $postvalues) { $pos = strpos($postvalues,"="); $_POST[urldecode(substr($postvalues,0,$pos))]=urldecode(substr($postvalues,$pos+1)); } $cookiebody = explode("; ",$event['headers']['cookie']); foreach ($cookiebody as $cookievalues) { $pos = strpos($cookievalues,"="); $_COOKIE[urldecode(substr($cookievalues,0,$pos))]=urldecode(substr($cookievalues,$pos+1)); }
這樣就方便使用了。
在云函數(shù) SCF 中,全局變量目前有個(gè)坑,就是上次訪問獲取的全局變量在這次并不會(huì)清空,所以本次訪問的時(shí)候,上次提交的值可能還在全局變量中,這個(gè)情況不管是 php 固有的超全局還是自己定義的,都有這個(gè)情況,所以使用前注意 unset。
用戶提交過來的數(shù)據(jù),除了 GET、POST、COOKIE,還有一種比較重要的就是路徑了,比如這樣一個(gè) url: /upload/otherpic73/727923.jpg,在 API 網(wǎng)關(guān)中,/path/file.jpg 會(huì)被放到 $event['path']
中,但注意,如果通過 API 網(wǎng)關(guān)默認(rèn) url 訪問,里面會(huì)含有 /functionname ,注意去除(以下代碼將路徑里起始的 '/' 也去除了):
$function_name = $context['function_name']; $host_name = $event['headers']['host']; $serviceId = $event['requestContext']['serviceId']; if ( $serviceId === substr($host_name,0,strlen($serviceId)) ) { // using long url of API gateway // 使用API網(wǎng)關(guān)長鏈接時(shí) $path = substr($event['path'], strlen('/' . $function_name . '/')); } else { // using custom domain // 使用自定義域名時(shí) $path = substr($event['path'], strlen($event['requestContext']['path']=='/'?'/':$event['requestContext']['path'].'/')); }
取得用戶提交的信息后,就可以自己處理了,過程不詳談,只是注意:
SCF 是只讀的,只有
/tmp/
目錄可讀寫,這個(gè) tmp 目錄并發(fā)實(shí)例間互不相通,實(shí)例結(jié)束后銷毀。
處理完后,就要輸出給瀏覽器了,注意,因?yàn)楦鸀g覽器對話的是 API 網(wǎng)關(guān),
在代碼中直接 echo 的話,只會(huì)顯示在運(yùn)行日志中,瀏覽器完全看不到,
所以
我們需要在
main\_handler
中把需要顯示的東西 return 給 API 網(wǎng)關(guān)。
這時(shí),如果要返回一個(gè)網(wǎng)頁,那 API 網(wǎng)關(guān)要勾選「集成響應(yīng)」,SCF 這邊要返回一個(gè)特定結(jié)構(gòu)的數(shù)組,這樣瀏覽器才會(huì)正常顯示,不然瀏覽器就會(huì)只看到一堆字符串。
return [ 'isBase64Encoded' => false, 'statusCode' => 200, 'headers' => [ 'Content-Type' => 'text/html' ], 'body' => $html ];
其中 body 就是我們要返回的網(wǎng)頁內(nèi)容,是個(gè)字符串;
headers 是給瀏覽器辨認(rèn)的,Location 或 Set-Cookie 要放在這里面;
statusCode 是狀態(tài)碼,可以在 Location 時(shí)為 302,也可以在某些時(shí)候 404;
isBase64Encoded 是 API 網(wǎng)關(guān)用的,告訴它,body 里面是否 base64 加密。
這樣返回,瀏覽器就會(huì)顯示一個(gè) HTML 網(wǎng)頁了。
但有些時(shí)候,我們想給一個(gè)文件給用戶下載,這時(shí)候,就要用到 isBase64Encoded 了:
$image_data = fread(fopen('logo.png', 'r'), filesize('logo.png')); return [ 'isBase64Encoded' => true, 'statusCode' => 200, 'headers' => [ 'Content-Type' => 'image/png' ], 'body' => base64_encode($image_data) ];
這樣瀏覽器會(huì)直接得到一個(gè) png 文件,有些瀏覽器彈出下載,有些自己就打開了。
上面代碼已經(jīng)提交到云函數(shù) SCF 模板庫:https://github.com/tencentyun/scf-demo-repo/tree/master/Php7.2-QRcodewithLogo ,不吝賜教!
看完上述內(nèi)容,你們掌握云函數(shù)SCF中PHP的入門坑有哪些的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
新聞標(biāo)題:云函數(shù)SCF中PHP的入門坑有哪些
標(biāo)題URL:http://chinadenli.net/article4/pijhie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、定制開發(fā)、電子商務(wù)、網(wǎng)站導(dǎo)航、用戶體驗(yàn)、面包屑導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)