之前其实已经和大家聊过一次用 FrankenPHP 启动 ThinkPHP 框架了,结果后台还是收到好多朋友的私信,问具体怎么操作,今天咱们就再从头到尾、一步一步捋一遍,保证哪怕是第一次接触 FrankenPHP 的朋友,跟着做也能顺利跑通!
FrankenPHP 是啥?
可能还有朋友对这个名字有点陌生,FrankenPHP 是个新兴的高性能 PHP 应用运行时和服务器,它是在 Caddy Web 服务器的基础上,专门为 PHP 打造的。你可以把它理解成「PHP 解释器 + Caddy 服务器」的组合体——既能让 PHP 应用跑得更快、资源消耗更低,又不用像传统 PHP-FPM 那样折腾复杂的配置,用起来省心不少。
第一步:先把 ThinkPHP8 项目搭起来
咱们从最基础的项目安装开始,用 Composer 一键就能搞定,非常方便:
composer create-project topthink/think ThinkPHP8
这里的「ThinkPHP8」是项目目录名,你可以随便改成自己喜欢的名字,这个目录就是咱们后面常说的「应用根目录」。
第二步:写个简单的测试控制器
为了后面能验证 FrankenPHP 能不能正常解析 PHP、路由通不通,咱们先写个简单的 Index 控制器。在 app/controller 目录下新建 Index.php,代码如下:
<?php/** * @desc FrankenPHP Index * @author Tinywan(ShaoBo Wan) */declare(strict_types=1);namespaceapp\controller;useapp\BaseController;usethink\Response;classIndexextendsBaseController{// 首页测试:返回简单字符串publicfunctionindex(): string{return'FrankenPHP PHP大神! ThinkPHP8'; }// 测试返回 JSON 格式数据publicfunctiontest(): Response{return json(['name' => 'PHP大神']); }// 带参数的测试方法publicfunctionhello($name = "FrankenPHP"): string{return"hello," . $name; }}
这几个方法都很简单,就是为了后面验证功能用的,大家直接复制过去就行。
第三步:配置 Caddyfile,这是核心步骤
FrankenPHP 是基于 Caddy 的,所以咱们需要在 ThinkPHP8 的根目录下新建一个 Caddyfile 文件,用来定义路由、PHP 脚本路径这些关键配置。下面是我整理好的基础配置,每一行我都加了注释,方便大家理解:
80 {# 网站根目录,对应容器内的 /app/public(FrankenPHP 默认以这个目录为根) root * /app/public# 启用响应压缩,提升页面传输速度 encode zstd br gzip# FrankenPHP 内置的 PHP 服务配置,替代传统的 php_fastcgi,更简单 php_server {# 传递 PATH_INFO 环境变量,适配 ThinkPHP 的路由规则 env PATH_INFO {http.matchers.file.remainder}# URL 重写规则,隐藏 index.php 入口文件,让 URL 更简洁 try_files {path} index.php/{path} }# 日志配置,方便调试log {# 日志输出到文件,对应 ThinkPHP8 本地的 runtime/log 目录 output file /app/runtime/log/caddy.log# 日志级别设为 DEBUG,有问题能更清楚地看到原因 level DEBUG }}
这里的 php_server 是 FrankenPHP 的专属指令,比传统的 fastcgi 配置简单很多,大家直接用这个配置就行。
第四步:启动 Docker 容器,一行命令搞定
我本地的 80 端口被占用了,所以映射了宿主机的 8089 端口,大家可以根据自己的情况修改。另外,镜像我选的是 dunglas/frankenphp:1.11.3-php8.4——最新的默认 8.5 版本可能会有报错,大家暂时先用这个稳定版,避避坑。
启动命令如下,注意把本地代码路径改成你自己的:
docker run \ --name tinywan-frankenphp \ -v d:/dnmp/www/frankenphp/ThinkPHP8:/app \ -v d:/dnmp/www/frankenphp/ThinkPHP8/Caddyfile:/etc/frankenphp/Caddyfile \ -p 8089:80 \ dunglas/frankenphp:1.11.3-php8.4
咱们简单解释一下几个关键参数:
-v:把本地的 ThinkPHP8 代码和 Caddyfile 挂载到容器里,这样改本地代码,容器里就能同步更新,不用重启容器;-p:把容器的 80 端口映射到宿主机的 8089 端口,方便咱们在本地浏览器访问;--name:给容器起个名字,后面想停止、删除容器的时候,用名字操作更方便。
启动成功后,你会看到类似这样的日志输出,说明 FrankenPHP 已经正常运行了:
{"level":"info","ts":1772425441.6438243,"msg":"maxprocs: Leaving GOMAXPROCS=4: CPU quota undefined"}{"level":"info","ts":1772425441.643848,"msg":"GOMEMLIMIT is updated","GOMEMLIMIT":3696769843,"previous":9223372036854775807}{"level":"info","ts":1772425441.643852,"msg":"using config from file","file":"/etc/frankenphp/Caddyfile"}
另外,日志里的 /app/runtime/log/caddy.log 会对应到咱们 ThinkPHP8 本地的 runtime/log 目录,要是后面出问题,直接去这里看日志就行,很方便。
第五步:测试访问,看看是不是跑通了
现在咱们来验证一下成果,打开浏览器或者用 Postman 访问下面的地址:
访问首页:http://127.0.0.1:8089/正常输出:FrankenPHP PHP大神! ThinkPHP8
访问带参数的路由:http://127.0.0.1:8089/index/hello?name=Tinywan正常输出:hello,Tinywan
能看到这两个输出,就说明咱们的FrankenPHP已经成功驱动ThinkPHP8应用了。
最后说两句
跟着这几步走,从安装项目、写控制器、配置 Caddyfile 到启动容器、测试访问,全程没什么复杂的操作,哪怕是第一次用 FrankenPHP,也能很快上手。以后大家再用 ThinkPHP 开发,不妨试试用 FrankenPHP 当服务器,性能和体验都很不错。