前言
这个文章介绍方案过时, 直接参考自定义镜像方案
函数计算目前已经支持了自定义镜像, 感兴趣的同学直接使用镜像体验更流畅,使用 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 化。
案例体验入口:
FC 运行larvel 流程
|-- 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)。
