侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

无服务器 PHP - 原生方式

技术  /  管理员 发布于 1年前   739

刚刚我在DEV社区看到的一篇文章,感觉很有意思,记录分享之。
我被另一篇文章触动了,该文章声称为 PHP 提供无服务器支持的大部分努力都集中在 AWS 上,并且 AWS 已经对 PHP 提供了本机支持。

从技术上讲,这两种说法都不正确。


首先,AWS 没有对 PHP 的原生支持。在无服务器世界中,支持一种语言意味着给定一个用该语言编写的函数,只需要一个调用方法(HTTP 调用、队列触发器等)来运行它。当您转到 AWS Lambda 并启动一个函数时,您应该能够选择一种语言、编写一个函数并运行它。这意味着您提供代码,AWS 提供运行时来执行它,并且它可以正常工作。

AWS 没有为 PHP 提供该功能。 AWS 提供的是一种定义自定义运行时的方法,您可以在该运行时下执行代码。这意味着您不仅需要提供一个函数,还需要提供运行代码和定义运行时(在本例中为 PHP 解释器)以执行它所需的所有引导程序。或者,您可以提供用于相同目的的 Docker 映像。


问题

AWS 的 PHP 无服务器方法的问题在于,考虑到您是在特定环境中进行设置,这样做的好处不值得付出努力。如果您有时间,请执行 AWS 链接上列出的步骤,然后考虑:

即使在 AWS 中,您也可以简单地设置一个 EKS 集群(AWS 最终改进了他们的工具,足以在几分钟内拥有一个具有合理安全默认值的生产集群)并部署类似 OpenFAAS 之类的东西,它允许您在优化下以各种语言部署无服务器功能容器。这是您在 PHP 上使用 Lambda 的第二个解决方案所获得的结果。


但是拥有 EKS 集群的好处是您可以通过 OpenFAAS(或其他类似的无服务器环境 - 还有 Apache OpenWhisk,我应该对它们进行比较)执行无服务器功能,并在一个应用程序中部署全服务器(?我猜)应用程序Kubernetes 集群并受益于服务网格、自动缩放等优点。

可是等等!还有更多! Kubernetes 设置也是可移植的!除了创建集群本身,如果明天您决定说“再见 AWS,你好 Azure!”您可以随身携带设置并在几分钟内启动并运行。


GCP 提供什么

与此相反,Google Cloud Functions for PHP 提供了一切,包括 boostrap。这意味着您可以编写一个简单的函数,该函数采用与 PSR 兼容的 RequestInterface 并返回一个字符串响应。

没错,遗憾的是,目前您必须返回一个普通字符串,尽管计划是最终能够返回 ResponseInterface。

除此之外,thins 非常简单。您可以将代码打包在一个 zip 中,以及一个用于依赖项的供应商文件夹。您可以创建具有各种函数的脚本,只要函数满足采用单个 RequestInterface 的标准,就可以将其选为入口点。

令人惊喜的是,相当基本的 PHP 函数(读取环境变量、解码 JSON 请求并使用 env 值 + JSON 请求中的一些字符串进行响应)的性能与 Cloud Functions 上的大多数其他产品相当(针对 Node 和 Go 进行了测试)。大约 100 毫秒的热调用,与冷调用的主要区别是这个普通的 PHP 函数花费的时间更长一些(~1.4s vs 0.6s)。


不要无服务器和框架

只要您不打算将无服务器功能用作穷人的网络服务器并在其背后抛出一个具有复杂路由的框架,这应该是一种补充 API 容量的体面方式。

为什么不是在无服务器函数平台上使用 PHP 框架的好方法?

这是因为整个运行时会上升并最终在函数结束后消失。当请求被触发时,在平台端这是(大致)发生的情况:


运行时已配置

该函数是自举的

函数运行(并且,对于解释语言,加载自定义依赖项)。

现在,PHP 可以并且确实在连续执行之间使用字节码缓存(该函数保持“温暖”一段时间)但最终运行时被“破坏”。

现在,想象一下使用一个框架。在每次执行时,框架都必须使用其依赖项进行 boostrap。由于它属于函数(作为入口点),因此必须在函数本身内完成。您将加载配置管理器、DI 容器、路由器、配置文件以及框架所需的其他内容。


在常规服务器上,事物会缓存在本地持久化的字节码缓存 (opcache) 中。当您使用各种参数调用各种端点时,每次调用所需的东西都会进入该缓存。

在无服务器执行中,雪上加霜的是,您不仅需要在最初预热函数,而且如果函数通过框架路由器管理不同的路由,则每条路由都需要稍微不同的代码,因此即使在连续调用之间

当该特定路由的依赖项不是“暖”的时,有五种情况......所以从技术上讲,它是一堆“冷”请求,导致(有点)较低的性能。 



转:https://dev.to/andreidascalu/serverless-php-the-native-way-odb



  • 上一条:
    idea打包成war包部署到tomcat及访问路径问题(图文详解)
    下一条:
    2019最新的Pycharm激活码(推荐)
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 最新国内免注册ChatGPT体验站_ChatGPT镜像站访问链接地址2023/3/28持续更新(0个评论)
    • 性能测试工具、HTTP基准测试工具:wrk(0个评论)
    • namesilo域名+香港服务器+acme.sh给网站生成免费ssl证书流程步骤(0个评论)
    • 控制反转IOC设计模式简单的示例代码(0个评论)
    • 来自京东开发者的接口优化的常见方案实战总结(0个评论)
    • 近期文章
    • 如何优雅处理async await错误推荐:await-to-js库(0个评论)
    • lodash工具库(0个评论)
    • 在Laravel项目中使用中间件方式统计用户在线时长功能代码示例(0个评论)
    • 在Laravel中构建业务流程模型(0个评论)
    • windows系统中安装FFMpeg及在phpstudy环境php7.3 + php-ffmpeg扩展的使用流程步骤(0个评论)
    • 在go语言中对浮点的数组、切片(slice)进行正向排序和反向排序(0个评论)
    • 在go语言中对整数数组、切片(slice)进行排序和反向排序(0个评论)
    • 在go语言中对字符串数组、切片(slice)进行排序和反向排序(0个评论)
    • 最新国内免注册ChatGPT体验站_ChatGPT镜像站访问链接地址2023/3/28持续更新(0个评论)
    • 在Laravel项目中的实现无密码认证之:发送邮箱链接授权(0个评论)
    • 近期评论
    • 博主 在

      2023年国务院办公厅春节放假通知:1月21日起休7天中评论 @ xiaoB 你只管努力,剩下的叫给天意;天若有情天亦老,..
    • xiaoB 在

      2023年国务院办公厅春节放假通知:1月21日起休7天中评论 会不会春节放假后又阳一次?..
    • BUG4 在

      你翻墙过吗?国内使用vpn翻墙可能会被网警抓,你需了解的事中评论 不是吧?..
    • 博主 在

      go语言+beego框架中获取get,post请求的所有参数中评论 @ t1  直接在router.go文件中配就ok..
    • Jade 在

      如何在MySQL查询中获得当月记录中评论 Dear zongscan.com team, We can skyroc..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2017-09
    • 2018-01
    • 2018-07
    • 2018-08
    • 2018-09
    • 2018-12
    • 2019-01
    • 2019-02
    • 2019-03
    • 2019-04
    • 2019-05
    • 2019-06
    • 2019-07
    • 2019-08
    • 2019-09
    • 2019-10
    • 2019-11
    • 2019-12
    • 2020-01
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客