首页 » 网站推广 » phppostbody技巧_云函数 SCF 中 PHP 的一些入门坑

phppostbody技巧_云函数 SCF 中 PHP 的一些入门坑

访客 2024-11-04 0

扫一扫用手机浏览

文章目录 [+]

本文来自 Serverless 社区用户「逸笙」投稿

main_handler($event, $context)函数会传入2个参数,首先这2个参数是object,须要用->来访问子项,如 $event->{'headers'} ,不是很方便,我一样平常转换成数组:

phppostbody技巧_云函数 SCF 中 PHP 的一些入门坑

$event = json_decode(json_encode($event), true);

这样就比较方便了,如 $event['headers']['host'] 。

phppostbody技巧_云函数 SCF 中 PHP 的一些入门坑
(图片来自网络侵删)

大家可以打印这两个参数看一眼里面有些什么。

我们可以从中获取到很多有用的东西,比如:

$_GET = $event['queryString'];$_POST = $event['body'];$_COOKIE = $event['headers']['cookie'];

在云函数 SCF 中运行的 php 程序,由于浏览器是提交给 API 网关,不是提交给 SCF 的,这些超全局变量完备没有获取到东西,以是要这样来获取。

但我们创造,$event['body'] 与 $event['headers']['cookie'] 本身是一个长字符串,里面有好几个值,并且里面 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));}

这样就方便利用了。

在云函数 SCF 中,全局变量目前有个坑,便是上次访问获取的全局变量在这次并不会清空,以是本次访问的时候,上次提交的值可能还在全局变量中,这个情形不管是 php 固有的超全局还是自己定义的,都有这个情形,以是利用前把稳 unset。

用户提交过来的数据,除了 GET、POST、COOKIE,还有一种比较主要的便是路径了,比如这样一个 url: https://hostname/path/file.jpg?foo=bar,在 API 网关中,/path/file.jpg 会被放到 $event['path'] 中,但把稳,如果通过 API 网关默认 url 访问,里面会含有 /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网关长链接时 $path = substr($event['path'], strlen('/' . $function_name . '/'));} else { // using custom domain // 利用自定义域名时 $path = substr($event['path'], strlen($event['requestContext']['path']=='/'?'/':$event['requestContext']['path'].'/'));}

取得用户提交的信息后,就可以自己处理了,过程不详谈,只是把稳:

SCF 是只读的,只有 /tmp/ 目录可读写,这个 tmp 目录并发实例间互不相通,实例结束后销毁。

处理完后,就要输出给浏览器了,把稳,由于跟浏览器对话的是 API 网关,

在代码中直接 echo 的话,只会显示在运行日志中,浏览器完备看不到,

以是

我们须要在 main\_handler 中把须要显示的东西 return 给 API 网关。

这时,如果要返回一个网页,那 API 网关要勾选「集成相应」,SCF 这边要返回一个特定构造的数组,这样浏览器才会正常显示,不然浏览器就会只看到一堆字符串。

return [ 'isBase64Encoded' => false, 'statusCode' => 200, 'headers' => [ 'Content-Type' => 'text/html' ], 'body' => $html];

个中 body 便是我们要返回的网页内容,是个字符串;

headers 是给浏览器辨认的,Location 或 Set-Cookie 要放在这里面;

statusCode 是状态码,可以在 Location 时为 302,也可以在某些时候 404;

isBase64Encoded 是 API 网关用的,见告它,body 里面是否 base64 加密。

这样返回,浏览器就会显示一个 HTML 网页了。

但有些时候,我们想给一个文件给用户下载,这时候,就要用到 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)];

这样浏览器会直接得到一个 png 文件,有些浏览器弹出下载,有些自己就打开了。

标签:

相关文章

Python编程从入门到精通,探索编程之美

编程已经成为现代社会的一项基本技能。Python作为一种简单易学、功能强大的编程语言,在我国教育领域备受关注。本文将从Python...

网站推广 2025-03-02 阅读1 评论0

Scum07代码编程之美与适用方法

编程已成为当今社会不可或缺的技能之一。Scum07代码作为一款经典的编程语言,在我国众多程序员中备受推崇。本文将深入解析Scum0...

网站推广 2025-03-02 阅读1 评论0

Linux环境下的前端代码运行优化与步骤

前端技术逐渐成为软件开发的核心。Linux操作系统因其稳定性、安全性、开放性等特点,成为众多开发者和企业青睐的运行环境。本文将从L...

网站推广 2025-03-02 阅读1 评论0