1: 介绍
Phlo 是一个集成平台,拥有自己的全栈语言。您编写 .phlo 源文件;Phlo 将它们编译为您可以打开和阅读的 PHP、CSS 和 JavaScript,所有运行时错误都指向您编写的 .phlo 行。相同的语言包含四个层次:语言本身、应用平台(后端资源加上 phlo.js SPA 引擎)、服务器平台(FrankenPHP、phloWS、phloWA)和操作平台(Phlo Dashboard)。本指南涵盖了所有这些内容。生产版本运行在共享运行时,通常在 /srv/phlo/ 中,而每个应用程序保留自己的源代码、数据、生成的 PHP 和 webroot。
1.1: 哲学
- 源代码优先:您在
.phlo中工作,而不是在生成的 PHP、CSS 或 JavaScript 中。 - 小型运行时:Web 入口点加载
/srv/phlo/phlo.php并使用phlo_app(...)启动应用程序。 - 显式运行时资源:
data/app.json选择应用程序从运行时目录加载哪些 Phlo 资源;应用程序代码保留在应用程序中。 - 开发和发布分开:开发构建、调试并可以使用身份验证;发布使用生成的输出。
- HTML、路由和行为紧密结合:当将路由、视图、样式或脚本放在同一主题文件中可以使应用程序更清晰时,可以这样做。
1.2: 安装
Phlo 需要 PHP 8.3 或更高版本;CLI 构建在相同的 PHP 上运行。对于生产环境,推荐使用 FrankenPHP 作为运行时(内置网络服务器,工作模式);经典的 PHP-FPM 在 Nginx 后面也可以工作。
使用捆绑的安装程序获取运行时并搭建您的第一个应用:
git clone https://github.com/q-ainl/phlo.git /srv/phlo
php /srv/phlo/install.php /srv/example.nl/
安装程序会询问名称、主机和目标,显示运行时目录并让您选择资源(它们的 @ requires 会自动包含),写入入口点、data/app.json、data/app.md、第一个 route 和 .gitignore,并在完成干净构建和具体后续步骤后才结束。
更喜欢一个能自我清理的副本吗?将 install.php 复制到新的应用目录并在那里运行;成功安装后它会自我删除:
cp /srv/phlo/install.php /srv/example.nl/ && cd /srv/example.nl && php install.php
接下来的部分描述了安装程序为您设置的内容,以及如何手动构建相同的东西。
1.3: 项目结构
一个典型的应用程序:
/srv/example.nl/
app.phlo
page.home.phlo
data/
app.json
auth.ini
creds.ini
php/
app.php
classmap.php
release/
www/
app.php
www/
app.php
php/、www/app.js、www/app.css 和 release/ 是构建输出。只能通过源代码更改它们并重新构建。
1.4: 入口点
开发入口点在 www/app.php:
<?php
require('/srv/phlo/phlo.php');
phlo_app (
id: 'Example',
host: 'dev.example.nl',
auth: true,
build: true,
debug: true,
app: '/srv/example.nl/',
data: '/srv/example.nl/data/',
);
发布入口点在 release/www/app.php:
<?php
require('/srv/phlo/phlo.php');
phlo_app (
id: 'Example',
host: 'stage.example.nl',
app: '/srv/example.nl/release/',
php: '/srv/example.nl/release/',
data: '/srv/example.nl/data/',
);1.5: Build
从开发入口点使用 CLI:
php www/app.php build::run
php www/app.php build::lint
php www/app.php build::release
build::run 转换开发输出,build::lint 检查生成的 PHP,build::release 写入发布输出。
1.6: 网络服务器
Web 服务器在开发环境中指向 www/,在阶段/生产环境中指向 release/www/。未知路径被重写为 app.php。
对于 FrankenPHP(推荐),一个 Caddyfile 块就足够了:
example.nl {
root * /srv/example.nl/release/www
php_server
}
对于 Nginx:
root /srv/example.nl/release/www;
location / {
try_files $uri $uri/ /app.php?$query_string;
}