仰望星辰工作室

better-staridc-MNBT

better-staridc-MNBT/ MPHX/bt_php.function.php 3.8 KB · 114 行 原始文件
Z zfhsh first commit 1 天前
1<?php
2/**
3 * BT节点 PHP 版本管理函数
4 *
5 * 系统底层函数,独立于任何插件,提供宝塔节点的 PHP 版本管理能力。
6 * 在 admin/api/bt.php、admin/api/zj.php、api/api.php 中均直接使用。
7 */
8
9if (!defined('IN_CRONLITE')) {
10 exit;
11}
12
13/**
14 * 获取指定节点的 PHP 版本列表(从宝塔 API 实时拉取)。
15 * @return array ['ok'=>bool, 'versions'=>array, 'latest'=>string, 'msg'=>string]
16 */
17function mnbt_node_php_list($btdh)
18{
19 global $DB;
20 $node = $DB->get_row_prepare("SELECT * FROM MN_bt WHERE btdh=? LIMIT 1", [$btdh]);
21 if (!$node) {
22 return ['ok' => false, 'msg' => '节点不存在'];
23 }
24 $bt_api_file = defined('SYSTEM_ROOT') ? SYSTEM_ROOT . 'bt_api.php' : ROOT . 'MPHX/bt_api.php';
25 if (!is_file($bt_api_file)) {
26 return ['ok' => false, 'msg' => 'bt_api 类文件缺失'];
27 }
28 require_once $bt_api_file;
29
30 $btipe = ($node['ptl'] == 'true' ? 'https' : 'http') . '://' . $node['btip'] . ':' . $node['btdk'];
31 $api = new bt_api($btipe, $node['btmy']);
32 $result = $api->btapi_listphp();
33 if (!is_array($result)) {
34 return ['ok' => false, 'msg' => '无法获取 PHP 版本列表', 'raw' => $result];
35 }
36 // 面板返回业务错误(连接失败/鉴权失败等),透出真实原因,避免误报为「未安装 PHP」
37 if (isset($result['status']) && ($result['status'] === false || $result['status'] === 0 || $result['status'] === '0')) {
38 return ['ok' => false, 'msg' => isset($result['msg']) ? $result['msg'] : '面板返回错误', 'raw' => $result];
39 }
40 // 移除纯静态(0)和自定义/其他(1),与用户端处理保持一致
41 unset($result[0], $result[1]);
42 $versions = [];
43 foreach ($result as $v) {
44 if (($v['status'] ?? false) && ($v['version'] ?? '') !== '00' && ($v['version'] ?? '') !== '0') {
45 $versions[] = ['version' => $v['version'], 'name' => $v['name'] ?? ('PHP-' . $v['version'])];
46 }
47 }
48 if (empty($versions)) {
49 return ['ok' => false, 'msg' => '该节点未安装任何 PHP 版本', 'raw' => $result];
50 }
51 usort($versions, function ($a, $b) {
52 return strcmp($b['version'], $a['version']);
53 });
54 return ['ok' => true, 'versions' => $versions, 'latest' => $versions[0]['version']];
55}
56
57/**
58 * 获取节点的当前默认 PHP 版本。
59 * 优先读取 mrbts_php,为空时自动检测并保存最新版本。
60 * @return string 版本号(空字符串表示无法获取)
61 */
62function mnbt_node_get_php($btdh)
63{
64 global $DB;
65 $node = $DB->get_row_prepare("SELECT mrbts_php FROM MN_bt WHERE btdh=? LIMIT 1", [$btdh]);
66 $php = $node['mrbts_php'] ?? '';
67 if ($php !== '' && $php !== '00') {
68 return $php;
69 }
70 $result = mnbt_node_auto_detect_php($btdh);
71 return $result['ok'] ? $result['version'] : '';
72}
73
74/**
75 * 设置节点的默认 PHP 版本。
76 */
77function mnbt_node_set_php($btdh, $version)
78{
79 global $DB;
80 $version = trim((string)$version);
81 if ($version === '') {
82 return false;
83 }
84 return (bool)$DB->query_prepare(
85 "UPDATE MN_bt SET mrbts_php=? WHERE btdh=? LIMIT 1",
86 [$version, $btdh]
87 );
88}
89
90/**
91 * 自动检测节点最新的 PHP 版本并保存为默认版本。
92 * @return array ['ok'=>bool, 'version'=>string, 'msg'=>string]
93 */
94function mnbt_node_auto_detect_php($btdh)
95{
96 $result = mnbt_node_php_list($btdh);
97 if (!$result['ok']) {
98 return $result;
99 }
100 $latest = $result['latest'];
101 if (!mnbt_node_set_php($btdh, $latest)) {
102 return ['ok' => false, 'msg' => '保存默认 PHP 版本失败'];
103 }
104 return ['ok' => true, 'version' => $latest, 'msg' => '已设置默认 PHP 版本为 ' . $latest];
105}
106
107/**
108 * 获取所有节点列表(含 mrbts_php 信息)。
109 */
110function mnbt_node_list_all()
111{
112 global $DB;
113 return $DB->get_all_prepare("SELECT * FROM MN_bt ORDER BY id ASC") ?: [];
114}