开发函数计算的正确姿势 —— 开发 WordPress 应用

简介:

前言

首先介绍下在本文出现的几个比较重要的概念:

__函数计算(Function Compute)__: 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。函数计算更多信息 参考

__Fun__: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API 网关、日志服务等资源。它通过一个资源配置文件(template.yml),协助您进行开发、构建、部署操作。Fun 的更多文档 参考

__Fun Local__: Fun Local 作为 Fun 的一个子命令存在,可以直接通过 fun local 命令使用。Fun Local 工具可以将函数计算中的函数在本地完全模拟运行,并提供单步调试的功能,旨在弥补函数计算相对于传统应用开发体验上的短板,并为用户提供一种解决函数计算问题排查的新途径。

备注: 本文介绍的技巧需要 Fun 版本大于等于 2.8.0。

声明:本文基于 十分钟上线-函数计算玩转 WordPress 提供的思路开发 wordpress 应用。

创建 fun 项目

创建一个目录作为 fun 项目的根目录,然后创建一个 index.php 编写函数代码:

<?php
use RingCentral\Psr7\Response;

function startsWith($haystack, $needle) {
    $length = strlen($needle);
    return (substr($haystack, 0, $length) === $needle);
}

function handler($request, $context): Response{
    $uri    = $request->getAttribute("requestURI");
    $uriArr = explode("?", $uri);

    // default php / or /wp-admin/
    if (preg_match('#/$#', $uriArr[0]) && !(strpos($uri, '.php'))) {
        $uriArr[0] .= "index.php";
        $uri = implode($uriArr);
        if (startsWith($uri, "/2016-08-15/proxy/share/wp-func/wp-admin/")) {
            // wordpress admin entrypoint
            $request = $request->withAttribute("requestURI", $uri);
        }
    }

    $proxy    = $GLOBALS['fcPhpCgiProxy'];
    $root_dir = '/mnt/www';
    
    //php script
    if (preg_match('#\.php.*#', $uri)) {
        $format = '%s.%s.fc.aliyuncs.com';
        $host   = sprintf($format, $context['accountId'], $context['region']); // maybe user define domain
        $resp   = $proxy->requestPhpCgi($request, $root_dir, "index.php",
            ['SERVER_NAME' => $host, 'SERVER_PORT' => '80', 'HTTP_HOST' => $host],
            ['debug_show_cgi_params' => false, 'readWriteTimeout' => 15000]
        );
        return $resp;
    } else {
        // static files, js, css, jpg ...
        $filename = $root_dir . explode("?", $uri)[0];
        $filename = rawurldecode($filename);
        $handle   = fopen($filename, "r");
        $contents = fread($handle, filesize($filename));
        fclose($handle);
        $headers = [
            'Content-Type'  => $proxy->getMimeType($filename),
            'Cache-Control' => "max-age=8640000",
            'Accept-Ranges' => 'bytes',
        ];
        return new Response(200, $headers, $contents);
    }
}

然后创建 template.yml:

ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:
  share:
    Type: 'Aliyun::Serverless::Service'
    Properties:
      Description: 'fc wordpress test'
      Policies: 
        - AliyunECSNetworkInterfaceManagementAccess
      VpcConfig:
        VpcId: 'vpc-bp12hm92gdpcjtai7ua82'
        VSwitchIds: [ 'vsw-bp1gitru7oicyyb4uiylj' ]
        SecurityGroupId: 'sg-bp1243pi65bw4cjj4bks'
      NasConfig: 
        UserId: -1
        GroupId: -1
        MountPoints: 
          - ServerAddr: '012194b28f-ujc20.cn-hangzhou.nas.aliyuncs.com:/'
            MountDir: '/mnt/www'

    wp-func:
      Type: 'Aliyun::Serverless::Function'
      Properties:
        Handler: index.handler
        Runtime: php7.2
        CodeUri: './index.php'
        Timeout: 100
      Events:
        http-test: # trigger name
          Type: HTTP # http trigger
          Properties:
              AuthType: ANONYMOUS
              Methods: ['GET', 'POST', 'PUT']

我们在 template.yml 中描述了 VPC、NAS 服务,以及 HTTP Trigger。至此,我们的函数就开发完了,在发布到线上前,我们需要先在本地调通。

通过执行 fun local start 可以将函数计算在本地模拟启动:

打开提示的 url,会得到错误提示:

这是因为我们没有安装 wordpress 的缘故。我们需要将 wordpress 安装到 NAS 挂载的目录上。fun local 对 NAS 的支持可以 参考。我们需要通过以下几步来让函数能够访问到 wordpress 应用:

  1. 下载 wordpress
  2. 解压下载的 wordpress。
  3. 将解压后的 wordpress 内容复制到本地模拟的 NAS 目录。

对于我们的项目,本地模拟的 NAS 目录为:.fun/nas/012194b28f-ujc20.cn-hangzhou.nas.aliyuncs.com/。这个目录在函数运行时,会被挂载到容器的 /mnt/www 下。函数可以直接访问该目录。

对于 wordprss 应用,我们需要在 .fun/nas/012194b28f-ujc20.cn-hangzhou.nas.aliyuncs.com/ 下依次创建子目录:2016-08-15/proxy/share/wp-func

可以直接通过命令完成:

mkdir -p .fun/nas/012194b28f-ujc20.cn-hangzhou.nas.aliyuncs.com/2016-08-15/proxy/share/wp-func

然后将解压后的 wordpress 的内容复制进来,也可以通过类似的命令完成:

cp -r wordpress/ .fun/nas/012194b28f-ujc20.cn-hangzhou.nas.aliyuncs.com/2016-08-15/proxy/share/wp-func/

操作完成后,不需要重启服务,直接刷新页面即可。

打开页面会显示配置向导,按照向导提示配置数据库、用户信息即可。

注意: 本地开发时,如果使用的 RDS,需要申请外网地址,并设置 IP 白名单为:0.0.0.0/0。但由于 0.0.0.0/0 表示允许任何设备访问 RDS 实例,除非是测试,否则不太推荐这么做。更好的做法是在本地使用 mysql 进行开发。由于函数是运行在 docker container 中的,网络环境与宿主机是隔离的,因此需要将本地 mysql 配置为允许任何 ip 访问。可以 参考

以下是一个 wordpress 本地启动后的效果演示:

本文作者:小默

相关实践学习
【AI破次元壁合照】少年白马醉春风,函数计算一键部署AI绘画平台
本次实验基于阿里云函数计算产品能力开发AI绘画平台,可让您实现“破次元壁”与角色合照,为角色换背景效果,用AI绘图技术绘出属于自己的少年江湖。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
目录
相关文章
|
2月前
|
人工智能 运维 Kubernetes
Serverless 应用引擎 SAE:为传统应用托底,为 AI 创新加速
在容器技术持续演进与 AI 全面爆发的当下,企业既要稳健托管传统业务,又要高效落地 AI 创新,如何在复杂的基础设施与频繁的版本变化中保持敏捷、稳定与低成本,成了所有技术团队的共同挑战。阿里云 Serverless 应用引擎(SAE)正是为应对这一时代挑战而生的破局者,SAE 以“免运维、强稳定、极致降本”为核心,通过一站式的应用级托管能力,同时支撑传统应用与 AI 应用,让企业把更多精力投入到业务创新。
457 30
|
2月前
|
人工智能 运维 安全
加速智能体开发:从 Serverless 运行时到 Serverless AI 运行时
在云计算与人工智能深度融合的背景下,Serverless 技术作为云原生架构的集大成者,正加速向 AI 原生架构演进。阿里云函数计算(FC)率先提出并实践“Serverless AI 运行时”概念,通过技术创新与生态联动,为智能体(Agent)开发提供高效、安全、低成本的基础设施支持。本文从技术演进路径、核心能力及未来展望三方面解析 Serverless AI 的突破性价值。
|
3月前
|
存储 人工智能 Serverless
函数计算进化之路:AI 应用运行时的状态剖析
AI应用正从“请求-响应”迈向“对话式智能体”,推动Serverless架构向“会话原生”演进。阿里云函数计算引领云上 AI 应用 Serverless 运行时技术创新,实现性能、隔离与成本平衡,开启Serverless AI新范式。
484 12
|
8月前
|
SQL 分布式计算 Serverless
鹰角网络:EMR Serverless Spark 在《明日方舟》游戏业务的应用
鹰角网络为应对游戏业务高频活动带来的数据潮汐、资源弹性及稳定性需求,采用阿里云 EMR Serverless Spark 替代原有架构。迁移后实现研发效率提升,支持业务快速发展、计算效率提升,增强SLA保障,稳定性提升,降低运维成本,并支撑全球化数据架构部署。
875 56
鹰角网络:EMR Serverless Spark 在《明日方舟》游戏业务的应用
|
6月前
|
存储 编解码 Serverless
Serverless架构下的OSS应用:函数计算FC自动处理图片/视频转码(演示水印添加+缩略图生成流水线)
本文介绍基于阿里云函数计算(FC)和对象存储(OSS)构建Serverless媒体处理流水线,解决传统方案资源利用率低、运维复杂、成本高等问题。通过事件驱动机制实现图片水印添加、多规格缩略图生成及视频转码优化,支持毫秒级弹性伸缩与精确计费,提升处理效率并降低成本,适用于高并发媒体处理场景。
340 0
|
3月前
|
人工智能 运维 安全
聚焦 AI 应用基础设施,云栖大会 Serverless AI 全回顾
2025 年 9 月 26 日,为期三天的云栖大会在杭州云栖小镇圆满闭幕。随着大模型技术的飞速发展,我们正从云原生时代迈向一个全新的 AI 原生应用时代。为了解决企业在 AI 应用落地中面临的高成本、高复杂度和高风险等核心挑战,阿里云基于函数计算 FC 发布一系列重磅服务。本文将对云栖大会期间 Serverless+AI 基础设施相关内容进行全面总结。
|
3月前
|
人工智能 Kubernetes 安全
重塑云上 AI 应用“运行时”,函数计算进化之路
回顾历史,电网的修建,深刻地改变了世界的经济地理和创新格局。今天,一个 AI 原生的云端运行时的进化,其意义也远不止于技术本身。这是一次设计哲学的升华:从“让应用适应平台”到“让平台主动理解和适应智能应用”的转变。当一个强大、易用、经济且安全的 AI 运行时成为像水电一样的基础设施时,它将极大地降低创新的门槛。一个独立的开发者、一个小型创业团队,将有能力去创造和部署世界级的 AI 应用。这才是技术平权的真谛,是激发全社会创新潜能的关键。
|
5月前
|
前端开发 UED
【转】WordPress 评论解锁插件开发教程
本文介绍如何开发一款WordPress评论解锁插件,实现“评论后查看隐藏内容”功能。通过短代码封装、Cookie识别评论状态、样式加载等核心逻辑,帮助网站提升互动性与内容价值。插件支持自定义提示语和样式,兼顾用户体验与安全性,适用于资源分享、文章互动等场景。
108 0
|
8月前
|
关系型数据库 MySQL PHP
WordPress 开发入门:代码详解与使用指南
本文详细介绍了WordPress开发入门知识,涵盖基础概念、环境搭建、主题与插件开发及常用技巧。首先讲解了WordPress的核心功能与开发环境配置,接着深入探讨主题开发,包括创建主题文件夹、核心文件(style.css和functions.php)以及模板文件的使用。随后介绍插件开发的基本步骤,如创建插件文件、添加功能并激活插件。最后推荐了开发资源,如官方文档、在线教程和优质市场。通过实践与学习,读者可掌握WordPress开发技术,构建个性化网站。
569 7
|
2月前
|
缓存 应用服务中间件 PHP
WordPress提速指南:Memcached+Super Static Cache+CDN缓存网站内容
本文分享三大网站提速方案:启用Memcached减少数据库压力,使用Super Static Cache生成静态页面,结合CDN实现全球加速,全面提升WordPress加载速度与用户体验。
161 1

热门文章

最新文章