2021-11-18  点击量: 13

阿里云函数计算FC配置PHP项目

阿里云提供了fcPhpCgiProxy,可以实现类似nginx一样的功能,用来搭建网站.

只需要指定原PHP项目的位置(上传到一个文件夹中),即可通过fcPhpCgiProxy直接调用,来实现原网站一样的体验.

因函数计算FC无法缓存文件(写操作),所以需要配置nas,我们把项目文件上传到/mnt/nfs/webroot中.

然后在函数计算FC入口文件index.php参考以下代码即可实现:

<?php
use RingCentral\Psr7\Response;
 
function handler($request, $context): Response {
    $host = "xxxx.xxxx.com";//使用的域名
    $root_dir = '/mnt/nfs/webroot';//你原项目放在的目录
    $requestURI = $request->getAttribute('requestURI');
    $filename = rawurldecode($root_dir . explode("?", $requestURI)[0]);
    // 取后缀名
    $ext = false;
    $pathinfo  = pathinfo($filename);
    if(!isset($pathinfo['extension'])){
    }else{
      $ext = strtolower($pathinfo['extension']);
    }
    // 判断文件是否存在
    $isFileExist = false;
    $isStaticFile = false;
    if (is_file($filename)) {
        $isFileExist = true;
        if (!empty($ext) && strtolower($ext)=='php') {
            // 动态
            $isStaticFile = false;
        } else {
            // 静态
            $isStaticFile = true;
        }
    } else {
        if (empty($ext)) {
            $phpIndex = '/'.trim($filename, '/').'/index.php';
            $htmlIndex = '/'.trim($filename, '/').'/index.html';
            if (is_file($phpIndex)) {
                // 动态
                $isFileExist = true;
                $isStaticFile = false;
                $filename = $phpIndex;
            } else if (is_file($htmlIndex)) {
                // 静态
                $isFileExist = true;
                $isStaticFile = true;
                $filename = $htmlIndex;
            }
        } else {
            // 动态
            $isStaticFile = false;
        }
    }
    // 调用动态或者静态文件
    if (!$isStaticFile) {
        $script_name = empty($ext) ? '/index.php' : ('/'. $pathinfo['basename']);
        $script_filename = $filename;
        if (!$isFileExist) {
            $script_filename = $root_dir . $script_name;
        }
        $GLOBALS['fcPhpCgiProxy'] = new \ServerlessFC\PhpCgiProxy();
        $resp = $GLOBALS['fcPhpCgiProxy']->requestPhpCgi(
            $request,
            $root_dir,
            trim($script_name, '/'),
            [
                'SERVER_NAME' => $host,
                'SERVER_PORT' => '80',
                'HTTP_HOST' => $host,
                'SCRIPT_FILENAME' => $script_filename,
                'SCRIPT_NAME' => $script_name
            ],
            ['debug_show_cgi_params' => true, 'readWriteTimeout' => 15000]
        );
        return $resp;
    } else {
        $GLOBALS['fcPhpCgiProxy'] = new \ServerlessFC\PhpCgiProxy();
        $handle   = fopen($filename, "r");
        $len = filesize($filename);
        $contents = $len > 0 ? fread($handle, $len) : '';
        fclose($handle);
        $ctype = '';
        if ($ext=='woff') { // 我项目需要的特别处理
            $ctype = 'application/font-woff';
        } else {
            try {
                $ctype = $GLOBALS['fcPhpCgiProxy']->getMimeType($filename);
            } catch (Exception $e) {
                $ctype = 'application/octet-stream';
            }
        }
        $headers = [
            'Content-Type'  => $ctype,
            'Cache-Control' => "max-age=8640000",
            'Accept-Ranges' => 'bytes',
        ];
        return new Response(200, $headers, $contents);
    }
}

 

使用代码时需注意修改 $host 和 $root_dir 变量

上面代码中有配置gd和sqlite库,如果不需要,可以删除对应的代码.如果需要,则需要上传对应的文件gd.so,gd.ini和pdo_sqlite.so,pdo_sqlite.ini.

这里提供网盘下载链接:(访问密码wdja)

http://share.menglei.net/f/16922972-521199080-416177

以上就是阿里云函数计算FC配置PHP项目的全部内容.

 

参考:https://blog.csdn.net/envon123/article/details/108210883

 

评论已关闭!