前言
这个文章介绍方案过时, 直接参考自定义镜像方案
函数计算目前已经支持了自定义镜像, 感兴趣的同学直接使用镜像体验更流畅,使用 custom-container, 和传统的 php 使用方法一致, 通过 S 工具可以一键部署
start-laravel
start-thinkphp
start-zblog
start-wordpress
start-discuz
@Deprecated
注意: 可以直接参考最新的官方文档:迁移 larvel 到函数计算
这篇文章是十分钟上线-函数计算玩转 WordPress的姊妹篇,有关函数计算的优势,php runtime 运行php 框架原理等相关内容可以先预览十分钟上线-函数计算玩转 WordPress,本文假设您已经理解函数计算 php runtime, vpc, nas, 自定义域名等相关内容的基础上,我们通过将github上一个star很高的larvel入门博客教程Learn-Laravel-5项目移植到在函数计算上, 展示函数计算环境驱动laravel的能力,实现 laravel web 项目 serverless 化。
案例体验入口:
- 体验地址:http://rayzhang.mofangdegisn.cn
后台登录:http://rayzhang.mofangdegisn.cn/admin
- 账号:fc-larvel-test@163.com
- 密码:larvel-pwd
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 storage
;chmod -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); } }
- 给函数入口配置自定义域名(操作过程请参考:绑定自定义域名示例), 具体配置假设如下:
注意: 绑定自定义域名之后,不用使用控制台来进行调试,就只能使用浏览器来触发函数,日志服务来进行调试。
总结
FC 可以做为 Web Backend,只需要编写一个函数实现传统 Web 服务器中的 conf 中的逻辑,就可以将一个完整的 Web 工程迁移到 FC ,从而从传统的 Web 网站运维,监控等繁琐的事务中解放出来。
最后欢迎大家通过扫码加入我们用户群中,搭建过程中有问题或者有其他问题可以在群里提出来。
函数计算官网客户群(11721331)。