| name | retiehe-web-hosting |
| description | Web development for Retiehe hosting platform. Use for creating PHP/Node.js cloud functions, using KV database, implementing common resources (jQuery, Vue, Bootstrap via CDN), handling requests/responses, session management, file operations, and database operations. |
| license | MIT |
| metadata | {"author":"retiehe","version":"1.0"} |
热铁盒网页托管开发
本技能提供了在热铁盒平台进行网页开发的完整指南,包括云函数开发、数据库操作、资源引用等。
目录
- 常见资源文件
- PHP 云函数
- Node.js 云函数
- 数据库操作
- 最佳实践
常见资源文件
对于常见的资源文件(如 jQuery、Bootstrap、Vue 等),建议使用公共 CDN 调用。
CDN 自动转换
热铁盒支持自动将常见的公共 CDN(CDNJS、JSDelivr npm、unpkg)链接转换为国内高速 CDN。
推荐使用 CDNJS:
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.7/js/bootstrap.min.js"></script>
弃用方式
通过文件名直接调用的方式已弃用(如 <script src="jquery.min.js"></script>),请改用公共 CDN。
PHP 云函数
基本使用
创建以 .php 结尾的文件,代码会在服务器后端执行。
第一个云函数:
<?php
echo "Hello, World!";
获取请求信息
$name = $_GET["name"];
$message = $_POST["message"];
$lang = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
$sid = $_COOKIE["sessionId"];
$ua = $_SERVER["HTTP_USER_AGENT"];
$ref = $_SERVER["HTTP_REFERER"];
$ip = $_SERVER["REMOTE_ADDR"];
$method = $_SERVER["REQUEST_METHOD"];
响应请求
echo "Hello, World!";
$data = ["message" => "Hello"];
echo json_encode($data);
http_response_code(404);
header("Cache-Control: max-age=3600");
setcookie("username", "Alice", time() + (7 * 24 * 60 * 60));
header("Location: https://example.com/");
exit;
Session 管理
session_start();
$_SESSION["username"] = "Alice";
if (isset($_SESSION["username"])) {
echo "欢迎," . $_SESSION["username"];
}
unset($_SESSION["username"]);
session_destroy();
读写文件
重要: 文件路径必须使用完整路径,不支持相对路径。
$content = file_get_contents("databases/data.txt");
$data = json_decode(file_get_contents("databases/data.json"), true);
file_put_contents("databases/data.txt", "Hello, File!");
$data = ["key" => "value"];
file_put_contents("databases/data.json", json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));
$files = scandir(".");
echo implode("<br>", $files);
$free_space = disk_free_space(".");
引入其他文件
require_once "lib/utils.php";
$message = greet("Alice");
Node.js 云函数
基本使用
创建以 .node.js 结尾的文件,代码会在服务器后端执行。
第一个云函数:
document.write("Hello, World!");
获取请求信息
const name = req.query.name;
document.write(name);
const message = req.body.message;
const acceptLanguage = req.headers["accept-language"];
const sessionId = req.cookies.sessionId;
const userAgent = req.headers["user-agent"];
document.write(navigator.userAgent);
document.write(req.headers.referer);
document.write(document.referrer);
const ip = req.ip;
const url = req.url;
document.write(location.href);
const method = req.method;
响应请求
res.write("Hello, ");
res.write("World!");
document.write("!");
res.end("Goodbye!");
res.send("Message");
const data = { message: "Hello, JSON!" };
res.json(data);
res.status(404);
res.statusCode = 404;
res.setHeader("Cache-Control", "max-age=3600");
res.set("Cache-Control", "max-age=3600");
res.cookie("username", "Alice", { maxAge: 7 * 24 * 60 * 60 * 1000 });
res.redirect("https://example.com/");
res.redirect(301, "https://example.com/");
location.href = "https://example.com/";
process.exit();
读写文件
重要: 文件路径必须使用完整路径,不支持相对路径。
const content = fs.readFileSync("databases/data.txt");
document.write(content);
const content = localStorage.getItem("databases/data.txt");
if (fs.existsSync("databases/data.txt")) {
const content = fs.readFileSync("databases/data.txt");
}
const content = fs.readFileSync("databases/data.json");
const data = JSON.parse(content);
fs.writeFileSync("databases/data.txt", "Hello, File!");
localStorage.setItem("databases/data.txt", "Hello, File!");
const data = { key: "value" };
fs.writeFileSync("databases/data.json", JSON.stringify(data));
const files = fs.readdirSync(".");
document.write(files);
const freeSpace = os.diskFreeSpace();
引入其他文件
导出模块 (utils.node.js):
function add(a, b) {
return a + b;
}
function greet(name) {
return `Hello, ${name}!`;
}
module.exports = { add, greet };
引入模块:
const utils = require("lib/utils.node.js");
const message = utils.greet("Alice");
document.write(message);
const sum = utils.add(3, 5);
document.write(sum);
引入 JSON 文件:
const config = require("config.json");
document.write(config.appName);
Node.js 内置模块:
支持的模块:crypto, fs, os, path, process, querystring
数据库操作
热铁盒提供 KV 数据库,每个网站可创建多个数据库。
基本操作
PHP:
$db = new Database("database_name");
$data = $db->get("key_name");
echo $data;
$db->set("key_name", "value");
$db->delete("key_name");
$keys = $db->list_keys();
echo implode("<br>", $keys);
Node.js:
const db = new Database("database_name");
const data = await db.get("key_name");
document.write(data);
db.set("key_name", "value");
db.delete("key_name");
const keys = await db.listKeys();
document.write(keys);
数组操作
PHP:
$db = new Database("database_name");
$db->push("key_name", "value1");
$db->push("key_name", "value2");
$values = $db->get_array("key_name");
echo implode("<br>", $values);
$db->delete("key_name", "value1");
$db->delete("key_name");
Node.js:
const db = new Database("database_name");
db.push("key_name", "value1");
db.push("key_name", "value2");
const values = await db.getArray("key_name");
document.write(values);
db.delete("key_name", "value1");
db.delete("key_name");
完整示例
PHP 访问统计:
<?php
$db = new Database("visits");
if (isset($_GET["name"])) {
$name = $_GET["name"];
$count = 0;
$data = $db->get($name);
if ($data !== null) {
$count = intval($data);
}
$count++;
$db->set($name, strval($count));
}
?>
<!DOCTYPE html>
<html>
<head><title>访问统计</title></head>
<body>
<?php if (isset($_GET["name"])) {
echo "<p>欢迎," . htmlspecialchars($name) . "!您访问了本站 $count 次。</p>";
} ?>
<form>
<label for="name">名字:</label>
<input type="text" id="name" name="name">
<input type="submit" />
</form>
</body>
</html>
Node.js 访问统计:
async function main() {
const db = new Database("visits");
const visitor = req.query.name;
let count = 0;
if (visitor) {
const data = await db.get(visitor);
if (data) {
count = parseInt(data);
}
count++;
db.set(visitor, count.toString());
}
document.write(`
<!DOCTYPE html>
<html>
<head><title>访问统计</title></head>
<body>
${visitor ? `<p>欢迎,${visitor}!您访问了本站 ${count} 次。</p>` : ""}
<form>
<label for="name">名字:</label>
<input type="text" id="name" name="name">
<input type="submit" />
</form>
</body>
</html>
`);
}
main();
第三方 SQL 数据库
仅 PHP 云函数支持连接第三方 SQL 数据库:
<?php
$conn = mysqli_connect("host", "username", "password", "database_name");
$result = mysqli_query($conn, "SELECT * FROM table_name");
while ($row = mysqli_fetch_assoc($result)) {
echo $row["column_name"] . "<br>";
}
mysqli_close($conn);
建议选择位于美国西部的数据库实例以获得最低延迟。
命名规则
- 数据库名称和键名只能包含:字母、数字、下划线
_、连字符 -
- 区分大小写
限制与注意事项
PHP 云函数
- 不能运行需要安装的 PHP 程序(如 WordPress、Discuz!)
- 不能写入 CSS、JavaScript、PHP 等代码文件
- 一次运行最多只能调用 10 次引入操作
Node.js 云函数
- 不支持安装 npm 依赖
- 不支持异步函数 (fs 模块只支持同步方法)
- 不能写入 CSS、JavaScript、PHP 等代码文件
共同限制
- 文本文件总大小限制:4 MB
- 超过此限制无法读写文件
- 建议使用数据库存储大量数据
路径说明
在热铁盒中,/ 是文件名的一部分,不支持相对路径。
- ❌ 错误:
__DIR__ . "/data.txt" 或 ../data.txt
- ✅ 正确:
data.txt 或 databases/data.txt
不要使用 __DIR__ 常量获取当前文件夹路径。
数据库管理
在网站列表中:
- 右键点击网站
- 选择「数据库」
- 可以浏览、修改、删除键值对
最佳实践
资源引用
- 优先使用公共 CDN(CDNJS)引用常见库
- 自动转换为国内高速 CDN,无需手动处理
数据存储
| 场景 | 推荐方案 |
|---|
| 配置文件 | JSON 文件 (小于 4 MB) |
| 用户数据 | KV 数据库 |
| 临时数据 | Session |
| 大量数据 | KV 数据库 (无大小限制) |
| 第三方数据 | SQL 数据库 |
性能优化
- 数组操作不如单个值高效,不要滥用
- 使用索引优化数据库查询(第三方 SQL 数据库)
- 合理设置缓存头
- 避免在云函数中进行大量计算
安全建议
- 对用户输入进行验证和过滤
- 使用
htmlspecialchars() 防止 XSS
- 敏感数据使用 HTTPS
- 不要在代码中暴露密码或密钥
- 验证请求来源和 Cookie
代码组织
- PHP 云函数:使用
require_once 模块化代码
- Node.js 云函数:使用
require() 和 module.exports
- 将通用工具函数放在单独的文件中
- 合理的目录结构有助于维护
调试技巧
- 使用简单的
echo / document.write 输出调试信息
- 检查文件路径是否正确
- 验证数据库连接状态
- 使用数据库管理界面直接查看数据
- 注意 PHP 的
session_start() 必须在所有输出之前调用
常见场景示例
RESTful API (PHP)
<?php
header("Content-Type: application/json");
$method = $_SERVER["REQUEST_METHOD"];
if ($method === "GET") {
echo json_encode(["status" => "ok", "data" => "GET"]);
} elseif ($method === "POST") {
echo json_encode(["status" => "ok", "data" => "POST"]);
}
RESTful API (Node.js)
if (req.method === "GET") {
res.json({ status: "ok", data: "GET" });
} else if (req.method === "POST") {
res.json({ status: "ok", data: "POST" });
}
表单处理 (PHP)
<?php
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$name = $_POST["name"];
$db = new Database("submissions");
$db->set(time(), $name);
echo "提交成功!";
}
?>
<form method="POST">
<input type="text" name="name" required>
<button type="submit">提交</button>
</form>
表单处理 (Node.js)
if (req.method === "POST") {
const name = req.body.name;
const db = new Database("submissions");
db.set(Date.now().toString(), name);
document.write("提交成功!");
}
document.write(`
<form method="POST">
<input type="text" name="name" required>
<button type="submit">提交</button>
</form>
`);
文件上传处理 (PHP - 简化版)
<?php
if ($_SERVER["REQUEST_METHOD"] === "POST" && isset($_FILES["file"])) {
$file = $_FILES["file"];
$target = "uploads/" . basename($file["name"]);
move_uploaded_file($file["tmp_name"], $target);
echo "上传成功!";
}
?>
<form method="POST" enctype="multipart/form-data">
<input type="file" name="file" required>
<button type="submit">上传</button>
</form>
相关资源