本文目录导读:

为 PHP 项目设计强制更新机制时,通常需要通过客户端(如 App、桌面客户端或浏览器) 主动请求服务端接口来校验版本,下面我会提供一个通用的接口设计方案,涵盖请求、响应、判断逻辑及示例代码。
接口设计思路
- 客户端请求:携带当前版本号、平台(如 Android、iOS、Web)等信息。
- 服务端响应:返回最新版本号、下载链接、更新类型(强制更新 / 非强制更新)、更新说明等。
- 强制更新逻辑:服务端根据客户端版本号与最新版本号进行对比,返回
update_type字段(如force、optional、none)。
接口定义示例
请求 URL
GET /api/check-version
请求参数
| 参数名 | 类型 | 描述 | 示例 |
|---|---|---|---|
app_version |
string | 当前客户端版本号 | 2.0 |
platform |
string | 平台标识 | android、ios、web |
响应格式(JSON)
{
"code": 200,
"message": "success",
"data": {
"latest_version": "1.3.0",
"current_version": "1.2.0",
"update_type": "force", // "force" | "optional" | "none"
"download_url": "https://xxx.com/download/1.3.0",
"release_notes": "修复了若干 bug,优化性能",
"force_version_range": "<=1.2.0" // 需要强制更新的版本范围(可选)
}
}
PHP 后端实现示例
<?php
// check_version.php
header('Content-Type: application/json');
// 模拟数据库中的版本配置
$versionConfig = [
'android' => [
'latest_version' => '1.3.0',
'force_min_version' => '1.2.0', // 低于此版本需要强制更新
'download_url' => 'https://xxx.com/download/android/1.3.0.apk',
'release_notes' => '新增支付功能,优化拍照体验',
],
'ios' => [
'latest_version' => '1.3.0',
'force_min_version' => '1.2.0',
'download_url' => 'https://apps.apple.com/xxx',
'release_notes' => '新增支付功能,优化拍照体验',
],
'web' => [
'latest_version' => '1.3.0',
'force_min_version' => '1.1.0', // Web 端因为刷新即更新,强制更新范围可更宽
'download_url' => '',
'release_notes' => '修复登录异常,提升页面响应速度',
],
];
// 获取请求参数
$appVersion = $_GET['app_version'] ?? '';
$platform = $_GET['platform'] ?? '';
// 参数校验
if (!$appVersion || !$platform) {
echo json_encode([
'code' => 400,
'message' => '参数缺失',
]);
exit;
}
// 检查平台是否存在
if (!isset($versionConfig[$platform])) {
echo json_encode([
'code' => 400,
'message' => '不支持的平台',
]);
exit;
}
$config = $versionConfig[$platform];
$latestVersion = $config['latest_version'];
$forceMinVersion = $config['force_min_version']; // 需要强制更新的最低版本(包含此版本)
// 版本号比较(需要自己实现版本比较函数,或使用 version_compare)
if (version_compare($appVersion, $latestVersion, '>=')) {
// 已是最新版本
$updateType = 'none';
} elseif (version_compare($appVersion, $forceMinVersion, '<=')) {
// 当前版本 <= 强制更新最低版本,需要强制更新
$updateType = 'force';
} else {
// 新版本可用,但非强制
$updateType = 'optional';
}
// 组装响应
$response = [
'code' => 200,
'message' => 'success',
'data' => [
'latest_version' => $latestVersion,
'current_version' => $appVersion,
'update_type' => $updateType,
'download_url' => $config['download_url'],
'release_notes' => $config['release_notes'],
'force_version_range' => "<= {$forceMinVersion}",
],
];
echo json_encode($response);
客户端处理逻辑(伪代码示例)
// 客户端(App 或 Web 页面)调用接口后
fetch('/api/check-version?app_version=1.2.0&platform=android')
.then(response => response.json())
.then(data => {
if (data.data.update_type === 'force') {
// 强制更新:弹出提示框,用户无法关闭,必须下载最新版本
showForceUpdateDialog(data.data.download_url);
} else if (data.data.update_type === 'optional') {
// 可选更新:弹出提示框,用户可以选择稍后更新
showOptionalUpdateDialog(data.data.download_url);
} else {
// 无需更新
console.log('当前已是最新版本');
}
});
扩展建议
- 版本号比较:建议使用 PHP 自带的
version_compare()函数,它支持标准语义化版本号(如2.3)。 - 安全校验:生产环境建议对接口增加签名或 token 校验,防止被恶意刷接口。
- 缓存策略:版本配置可缓存(如 Redis),避免每次请求都查数据库。
- 灰度发布:可在接口中增加
is_force针对特定用户群体或版本范围进行强制更新(如force_version_range字段)。 - Web 端特殊处理:Web 应用通常刷新即获取最新代码,但可以提示用户刷新页面,对于传统 MPA(多页应用),也可通过接口返回新版本号,客户端定时轮询并弹窗提醒。
更灵活的版本范围配置(进阶)
如果希望支持更复杂的强制更新范围(如 0.0 到 2.0 之间的所有版本都强制更新),可以使用如下配置:
$force_ranges = [
['min' => '1.0.0', 'max' => '1.2.0'],
['min' => '1.3.0', 'max' => '1.3.5'], // 特殊版本范围
];
// 判断当前版本是否属于任一强制更新范围
function isForceUpdate($currentVersion, $ranges) {
foreach ($ranges as $range) {
if (version_compare($currentVersion, $range['min'], '>=')
&& version_compare($currentVersion, $range['max'], '<=')) {
return true;
}
}
return false;
}
这样可以让版本控制更精细,适用于有多个历史版本需要单独处理的场景。
- 接口核心是返回
update_type字段,让客户端做不同行为。 - 强制更新逻辑在服务端判断,灵活且安全。
- 强制更新一般用于安全修复、重大功能变更,避免用户使用旧版本导致问题。
如果还有关于具体客户端(App、前端)如何处理下载后静默安装、或者如何通过 WebSocket 实时推送更新通知的问题,也可以进一步讨论。