前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于php laravel框架的crm系统迁移部署到云函数

基于php laravel框架的crm系统迁移部署到云函数

原创
作者头像
用户4586198
发布2019-07-03 13:14:21
1.9K0
发布2019-07-03 13:14:21
举报
文章被收录于专栏:demodemo

本文介绍了如何将传统的php+nginx的laravel框架搭建的web项目如何迁移部署到云函数的过程,对于原理如果清楚了的话,同样可以应用到其他的框架上。对比于传统方式,Serverless有以下的一些优点:

知识点

  1. 如何将laravel框架改造部署到云函数
  2. 如何实践crm系统部署云函数的整个流程

步骤一:准备工作(环境搭建)

  • IDE:phpstorm,sublime,zend studio等。链接(https://www.jetbrains.com/phpstorm/)
  • laravel框架的crm系统代码包

步骤二:laravel框架代码改造和入口函数实现

1 在代码根目录下新建一个index.php作为函数的入口文件,入口函数为标准的$event, $content入参格式,代码如下:

<?php

function main_handler($event, $context) {

print "start main handler\n";

}

?>

2 入口函数index.php文件增加静态文件路由请求处理,静态文件通过api网关请求的path路径路由到不同的文件,读取本地内容返回给api网关。

if (preg_match('#\.html.*|\.js.*|\.css.*|\.html.*#', $event->path) || preg_match('#\.gif.*|\.jpg.*|\.png.*|\.jepg.*|\.swf.*|\.bmp.*|\.ico.*#', $event->path)) {

$filename = "/var/user/public" . $event->path;

echo $filename;

$handle = fopen($filename, "r");

$contents = fread($handle, filesize($filename));

echo $contents;

fclose($handle);

if (preg_match('#\.gif.*|\.jpg.*|\.png.*|\.jepg.*|\.swf.*|\.bmp.*|\.ico.*#', $event->path)) {

return array(

"isBase64Encoded" => true,

"statusCode"=> 200,

"headers"=> [

'Content-Type' => '',

'Cache-Control' => "max-age=86400",

],

"body"=> base64_encode($contents),

);

} else {

return array(

'isBase64Encoded' => false,

'statusCode' => 200,

'headers' => [

'Content-Type' => '',

'Cache-Control' => "max-age=8640000",

'Accept-Ranges' => 'bytes',

],

'body' => $contents

);

}

}

3 laravel框架改造,由于laravel写缓存和日志是分别写在storage/framework和storage/logs目录下面,而对于云函数为了保证代码包一致性,对于代码包目录是不可写的,我们需要将日志和缓存写到/tmp临时目录下面,同时为了将日志能够输出到控制台,需要将框架修改如下:

3.1 缓存目录重写定义目录,修改bootstrap/app.php文件,增加如下代码,将缓存目录写到/tmp目录下:

$path_storage = "/tmp";

$app->useStoragePath($path_storage);

并在\vendor\laravel\framework\src\Illuminate\Foundation\Application.php文件修改bootstrap缓存文件目录:

return '/tmp'.($path ? DIRECTORY_SEPARATOR.$path : $path);

同时在入口函数index.php文件,新建这些目录

system("mkdir -p /tmp/cache");

system("mkdir -p /tmp/logs");

system("mkdir -p /tmp/framework/sessions");

system("mkdir -p /tmp/framework/cache");

system("mkdir -p /tmp/framework/views");

system("chmod -R 755 /tmp");

3.2 日志打印到控制台便于调试,在/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php增加一条echo将日志打印到云函数控制台

echo (string) $record['formatted'];

4 php文件路由,走本来配置好的路由。在入口函数index.php文件最后增加如下函数即可。

require __DIR__.'/bootstrap/autoload.php';

$app = require __DIR__.'/bootstrap/app.php';

$req = $event->body;

$data = !empty($req) ? json_decode($req, true) : [];

$event->path = str_replace("//", "/", $event->path);

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

$request = \Illuminate\Http\Request::create($event->path,$event->httpMethod,$data, [], [], []);

$response = $kernel->handle(

$request

);

$content = $response->getContent();

$headers = [

'Content-Type' => '',

];

return array(

'isBase64Encoded' => false,

'statusCode' => 200,

'headers' => $headers,

'body' => $content

);

步骤三:部署代码到云端,在线调试

  • 打包整个项目代码包,在控制台上传代码,指定入口函数
  • 创建和修改api网关触发器(步骤详细)

1 创建一个api网关触发器,选择集成响应,保存:

2 编辑api网关触发器,修改目录到根目录:

3 修改后需要发布一下

  • 在线调试,访问 https://service-ivupdw2r-1253970226.ap-shanghai.apigateway.myqcloud.com/test/index.html(注意域名替换为自己的) 查看系统跑在云函数上的实际效果,如果有错误可在控制台查看错误日志找出错误原因

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云函数
云函数(Serverless Cloud Function,SCF)是腾讯云为企业和开发者们提供的无服务器执行环境,帮助您在无需购买和管理服务器的情况下运行代码。您只需使用平台支持的语言编写核心代码并设置代码运行的条件,即可在腾讯云基础设施上弹性、安全地运行代码。云函数是实时文件处理和数据处理等场景下理想的计算平台。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档