阿里云提供了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