阿里云 Serverless Computing + 关注
手机版

十分钟上线-函数计算&Laravel的那些事儿

  1. 云栖社区>
  2. 阿里云 Serverless Computing>
  3. 博客>
  4. 正文

十分钟上线-函数计算&Laravel的那些事儿

rsong 2018-10-07 20:26:58 浏览1610 评论3

摘要: 这篇文章是[十分钟上线-函数计算玩转 WordPress](https://yq.aliyun.com/articles/640912)的姊妹篇,本文中我们将github上一个star很高的larvel入门博客教程Learn-Laravel-5项目移植到在函数计算上, 展示函数计算环境驱动laravel的能力,实现 laravel web 项目 serverless 化。

前言

这篇文章是十分钟上线-函数计算玩转 WordPress的姊妹篇,有关函数计算的优势,php runtime 运行php 框架原理等相关内容可以先预览十分钟上线-函数计算玩转 WordPress,本文假设您已经理解函数计算 php runtime, vpc, nas, 自定义域名等相关内容的基础上,我们通过将github上一个star很高的larvel入门博客教程Learn-Laravel-5项目移植到在函数计算上, 展示函数计算环境驱动laravel的能力,实现 laravel web 项目 serverless 化。

案例体验入口:

FC 运行larvel 流程

  • 下载 Learn-Laravel-5,准备好mysql数据库。

    • 修改.env, 主要是修改数据库连接相关内容
    DB_CONNECTION=mysql
    DB_HOST=rm-xxyyyy12583ck110swao.mysql.rds.aliyuncs.com
    DB_PORT=3306
    DB_DATABASE=fc-larvel
    DB_USERNAME=haha
    DB_PASSWORD=pwd123456
    • php artisan migrate,做数据库初始化工作
    • chmod -R 777 storagechmod -R 777 bootstrap/cache, 保证这两个目录可写
    • 执行命令php artisan key:generate,生成app_key
  • 将 Learn-Laravel-5 工程移到上述配置的 NAS 中, www 表示 Learn-Laravel-5 的工程的根目录。
|-- index.py
|-- www

index.py代码:

# -*- coding: utf-8 -*-
import logging  
import os

file = "/mnt/www/"

def mkdir(path):
  folder = os.path.exists(path)
  if not folder:                  
    os.makedirs(path)           
    
def lsDir():
  os.system("ls -ll /mnt/www/")

def handler(event, context):
  mkdir(file)  
  os.system("cp -r /code/www/* /mnt/www/")
  os.system("cp -a /code/www/.env /mnt/www/.env")
  print(lsDir())
  return 'ok'

基于上述代码创一个函数 move-larvel-nas , 执行函数,将 Learn-Laravel-5 工程包移动到 NAS 的/mnt/www/ 目录。

注: 在第一步初始化的时候,可以使用数据库的公网地址; 在函数计算的环境中,使用vpc,可以修改.env, 将其改为内网地址,更加安全

  • 编写函数,代码如下:
    laravel 是单入口框架,所有的url都是经过 public/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");
        
        $isPhpScript = false;
        $root_dir = '/mnt/www';
        $filename = $root_dir . explode("?", $uri)[0];
        $filename = rawurldecode($filename);
        
        $pathinfo  = pathinfo($filename);
        if(!isset($pathinfo['extension'])){
          $isPhpScript = true;
        }else{
          $extension = strtolower($pathinfo['extension']);
          if($extension == 'php'){
            $isPhpScript = true;
          }
        }
        
        $proxy    = $GLOBALS['fcPhpCgiProxy'];
        //php script
        if ($isPhpScript) {
            $host   = "rayzhang.mofangdegisn.cn";
            $resp   = $proxy->requestPhpCgi($request, $root_dir, "index.php",
                ['SERVER_NAME' => $host, 'SERVER_PORT' => '80', 'HTTP_HOST' => $host,
                'SCRIPT_FILENAME' => $root_dir . "/public/index.php",
                    'SCRIPT_NAME' => "/index.php"],
                ['debug_show_cgi_params' => true, 'readWriteTimeout' => 20000]
            );
            return $resp;
        } else {
            // static files, js, css, jpg ...
            $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);
        }
    }
  • 给函数入口配置自定义域名(操作过程请参考:绑定自定义域名示例), 具体配置假设如下:
    image

注意: 绑定自定义域名之后,不用使用控制台来进行调试,就只能使用浏览器来触发函数,日志服务来进行调试。

总结

FC 可以做为 Web Backend,只需要编写一个函数实现传统 Web 服务器中的 conf 中的逻辑,就可以将一个完整的 Web 工程迁移到 FC ,从而从传统的 Web 网站运维,监控等繁琐的事务中解放出来。

最后欢迎大家通过扫码加入我们用户群中,搭建过程中有问题或者有其他问题可以在群里提出来。

函数计算官网客户群(11721331)。
image

【云栖快讯】阿里巴巴小程序繁星计划,20亿补贴第一弹云应用免费申请,限量从速!  详情请点击

网友评论