diff --git a/internal/route/http.go b/internal/route/http.go index 4c1afaa8..b95f2313 100644 --- a/internal/route/http.go +++ b/internal/route/http.go @@ -298,6 +298,7 @@ func (route *Http) Register(r *chi.Mux) { r.Get("/is_installed", route.environment.IsInstalled) r.Route("/php", func(r chi.Router) { r.Post("/{version}/set_cli", route.environmentPHP.SetCli) + r.Get("/{version}/phpinfo", route.environmentPHP.PHPInfo) r.Get("/{version}/config", route.environmentPHP.GetConfig) r.Post("/{version}/config", route.environmentPHP.UpdateConfig) r.Get("/{version}/fpm_config", route.environmentPHP.GetFPMConfig) diff --git a/internal/service/environment_php.go b/internal/service/environment_php.go index 4d2cc458..b227bb20 100644 --- a/internal/service/environment_php.go +++ b/internal/service/environment_php.go @@ -56,6 +56,27 @@ func (s *EnvironmentPHPService) SetCli(w http.ResponseWriter, r *http.Request) { Success(w, nil) } +func (s *EnvironmentPHPService) PHPInfo(w http.ResponseWriter, r *http.Request) { + req, err := Bind[request.EnvironmentPHPVersion](r) + if err != nil { + Error(w, http.StatusUnprocessableEntity, "%v", err) + return + } + if !s.environmentRepo.IsInstalled("php", fmt.Sprintf("%d", req.Version)) { + Error(w, http.StatusUnprocessableEntity, s.t.Get("PHP-%d is not installed", req.Version)) + return + } + + // 使用 php-cgi 执行 phpinfo() 获取 HTML 格式输出 + output, err := shell.Execf("echo ' http.Post(`/environment/php/${slug}/set_cli`), + // 获取 phpinfo + phpinfo: (slug: number): any => http.Get(`/environment/php/${slug}/phpinfo`), // 获取配置 config: (slug: number): any => http.Get(`/environment/php/${slug}/config`), // 保存配置 diff --git a/web/src/locales/en.po b/web/src/locales/en.po index edf5dd90..4187e8dd 100644 --- a/web/src/locales/en.po +++ b/web/src/locales/en.po @@ -3744,6 +3744,10 @@ msgstr "Task submitted, please check progress in background tasks" msgid "Set as CLI Default Version" msgstr "Set as CLI Default Version" +#: src/views/environment/PHPView.vue:201 +msgid "View PHPInfo" +msgstr "View PHPInfo" + #: src/views/environment/PHPView.vue:203 msgid "" "This modifies the PHP %{ version } main configuration file. If you do not " @@ -6969,6 +6973,10 @@ msgstr "" msgid "Enter the default cipher suite, leave blank to reset to default" msgstr "" +#: src/views/environment/PHPView.vue:294 +msgid "PHPInfo" +msgstr "PHPInfo" + #~ msgid "Edit - %{ file }" #~ msgstr "Edit - %{ file }" diff --git a/web/src/locales/frontend.pot b/web/src/locales/frontend.pot index 86bea75a..c9ba0a3a 100644 --- a/web/src/locales/frontend.pot +++ b/web/src/locales/frontend.pot @@ -232,8 +232,8 @@ msgstr "" #: src/views/apps/rsync/IndexView.vue:177 #: src/views/apps/supervisor/IndexView.vue:219 #: src/views/apps/supervisor/IndexView.vue:284 -#: src/views/environment/PHPView.vue:137 -#: src/views/environment/PHPView.vue:143 +#: src/views/environment/PHPView.vue:154 +#: src/views/environment/PHPView.vue:160 #: src/views/project/EditModal.vue:157 #: src/views/setting/IndexView.vue:55 #: src/views/toolbox/SystemView.vue:51 @@ -634,7 +634,7 @@ msgstr "" #: src/views/apps/rsync/IndexView.vue:191 #: src/views/apps/supervisor/IndexView.vue:298 #: src/views/container/ContainerView.vue:102 -#: src/views/environment/PHPView.vue:175 +#: src/views/environment/PHPView.vue:192 msgid "Running Status" msgstr "" @@ -800,8 +800,8 @@ msgstr "" #: src/views/apps/redis/IndexView.vue:63 #: src/views/apps/rsync/IndexView.vue:235 #: src/views/apps/supervisor/IndexView.vue:342 -#: src/views/environment/PHPView.vue:212 -#: src/views/environment/PHPView.vue:230 +#: src/views/environment/PHPView.vue:232 +#: src/views/environment/PHPView.vue:250 #: src/views/project/EditModal.vue:575 #: src/views/setting/IndexView.vue:106 #: src/views/task/CronView.vue:259 @@ -1107,7 +1107,7 @@ msgstr "" #: src/views/database/DatabaseList.vue:101 #: src/views/database/ServerList.vue:214 #: src/views/database/UserList.vue:189 -#: src/views/environment/PHPView.vue:101 +#: src/views/environment/PHPView.vue:106 #: src/views/file/ListView.vue:185 #: src/views/file/ListView.vue:235 #: src/views/file/ListView.vue:1355 @@ -1411,7 +1411,7 @@ msgstr "" #: src/views/app/AppView.vue:152 #: src/views/app/AppView.vue:157 #: src/views/app/EnvironmentView.vue:145 -#: src/views/environment/PHPView.vue:74 +#: src/views/environment/PHPView.vue:79 msgid "Install" msgstr "" @@ -1421,7 +1421,7 @@ msgstr "" #: src/views/app/AppView.vue:40 #: src/views/app/EnvironmentView.vue:33 -#: src/views/environment/PHPView.vue:43 +#: src/views/environment/PHPView.vue:48 #: src/views/project/EditModal.vue:188 #: src/views/project/ListView.vue:38 msgid "Description" @@ -1459,7 +1459,7 @@ msgstr "" #: src/views/database/DatabaseList.vue:77 #: src/views/database/ServerList.vue:134 #: src/views/database/UserList.vue:151 -#: src/views/environment/PHPView.vue:50 +#: src/views/environment/PHPView.vue:55 #: src/views/file/ListView.vue:1206 #: src/views/firewall/ForwardView.vue:79 #: src/views/firewall/IpRuleView.vue:121 @@ -1590,7 +1590,7 @@ msgstr "" #: src/views/apps/redis/IndexView.vue:78 #: src/views/apps/rsync/IndexView.vue:240 #: src/views/apps/supervisor/IndexView.vue:347 -#: src/views/environment/PHPView.vue:245 +#: src/views/environment/PHPView.vue:265 msgid "Runtime Logs" msgstr "" @@ -1798,7 +1798,7 @@ msgstr "" #: src/views/apps/nginx/NginxIndex.vue:130 #: src/views/apps/postgresql/IndexView.vue:30 #: src/views/apps/redis/IndexView.vue:24 -#: src/views/environment/PHPView.vue:115 +#: src/views/environment/PHPView.vue:120 msgid "Property" msgstr "" @@ -1807,7 +1807,7 @@ msgstr "" #: src/views/apps/nginx/NginxIndex.vue:137 #: src/views/apps/postgresql/IndexView.vue:37 #: src/views/apps/redis/IndexView.vue:31 -#: src/views/environment/PHPView.vue:122 +#: src/views/environment/PHPView.vue:127 msgid "Current Value" msgstr "" @@ -1820,7 +1820,7 @@ msgstr "" #: src/views/apps/nginx/NginxIndex.vue:535 #: src/views/apps/postgresql/IndexView.vue:100 #: src/views/apps/redis/IndexView.vue:68 -#: src/views/environment/PHPView.vue:235 +#: src/views/environment/PHPView.vue:255 #: src/views/home/IndexView.vue:488 msgid "Load Status" msgstr "" @@ -1843,8 +1843,8 @@ msgstr "" #: src/views/apps/nginx/NginxIndex.vue:329 #: src/views/apps/postgresql/IndexView.vue:56 #: src/views/apps/supervisor/IndexView.vue:225 -#: src/views/environment/PHPView.vue:149 -#: src/views/environment/PHPView.vue:155 +#: src/views/environment/PHPView.vue:166 +#: src/views/environment/PHPView.vue:172 #: src/views/website/EditView.vue:160 msgid "Cleared successfully" msgstr "" @@ -1910,7 +1910,7 @@ msgstr "" #: src/views/apps/nginx/NginxIndex.vue:552 #: src/views/apps/postgresql/IndexView.vue:114 #: src/views/apps/supervisor/IndexView.vue:354 -#: src/views/environment/PHPView.vue:252 +#: src/views/environment/PHPView.vue:272 msgid "Clear Log" msgstr "" @@ -1919,7 +1919,7 @@ msgid "Slow Query Log" msgstr "" #: src/views/apps/mysql/MysqlIndex.vue:134 -#: src/views/environment/PHPView.vue:262 +#: src/views/environment/PHPView.vue:282 msgid "Clear Slow Log" msgstr "" @@ -2042,7 +2042,7 @@ msgid "Add Upstream" msgstr "" #: src/views/apps/nginx/NginxIndex.vue:548 -#: src/views/environment/PHPView.vue:248 +#: src/views/environment/PHPView.vue:268 msgid "Error Logs" msgstr "" @@ -2202,7 +2202,7 @@ msgstr "" #: src/views/apps/redis/IndexView.vue:51 #: src/views/apps/rsync/IndexView.vue:223 #: src/views/apps/supervisor/IndexView.vue:330 -#: src/views/environment/PHPView.vue:199 +#: src/views/environment/PHPView.vue:219 msgid "Main Configuration" msgstr "" @@ -2219,7 +2219,7 @@ msgid "This modifies the PostgreSQL user configuration file. If you do not under msgstr "" #: src/views/apps/postgresql/IndexView.vue:120 -#: src/views/environment/PHPView.vue:258 +#: src/views/environment/PHPView.vue:278 msgid "Slow Logs" msgstr "" @@ -2365,7 +2365,7 @@ msgid "Are you sure you want to delete module %{ name }?" msgstr "" #: src/views/apps/rsync/IndexView.vue:194 -#: src/views/environment/PHPView.vue:186 +#: src/views/environment/PHPView.vue:206 msgid "Module Management" msgstr "" @@ -3831,43 +3831,51 @@ msgstr "" msgid "Are you sure you want to delete the user?" msgstr "" -#: src/views/environment/PHPView.vue:36 +#: src/views/environment/PHPView.vue:41 msgid "Module Name" msgstr "" -#: src/views/environment/PHPView.vue:64 +#: src/views/environment/PHPView.vue:69 msgid "Are you sure you want to install %{ name }?" msgstr "" -#: src/views/environment/PHPView.vue:89 +#: src/views/environment/PHPView.vue:94 msgid "Are you sure you want to uninstall %{ name }?" msgstr "" -#: src/views/environment/PHPView.vue:131 +#: src/views/environment/PHPView.vue:136 msgid "Set successfully" msgstr "" -#: src/views/environment/PHPView.vue:161 -#: src/views/environment/PHPView.vue:167 +#: src/views/environment/PHPView.vue:178 +#: src/views/environment/PHPView.vue:184 msgid "Task submitted, please check progress in background tasks" msgstr "" -#: src/views/environment/PHPView.vue:181 +#: src/views/environment/PHPView.vue:198 msgid "Set as CLI Default Version" msgstr "" -#: src/views/environment/PHPView.vue:203 +#: src/views/environment/PHPView.vue:201 +msgid "View PHPInfo" +msgstr "" + +#: src/views/environment/PHPView.vue:223 msgid "This modifies the PHP %{ version } main configuration file. If you do not understand the meaning of each parameter, please do not modify it randomly!" msgstr "" -#: src/views/environment/PHPView.vue:217 +#: src/views/environment/PHPView.vue:237 msgid "FPM Configuration" msgstr "" -#: src/views/environment/PHPView.vue:221 +#: src/views/environment/PHPView.vue:241 msgid "This modifies the PHP %{ version } FPM configuration file. If you do not understand the meaning of each parameter, please do not modify it randomly!" msgstr "" +#: src/views/environment/PHPView.vue:294 +msgid "PHPInfo" +msgstr "" + #: src/views/error-page/NotFound.vue:11 msgid "Sorry, the page you visited does not exist." msgstr "" diff --git a/web/src/locales/zh_CN.po b/web/src/locales/zh_CN.po index 58583be1..da0fefbf 100644 --- a/web/src/locales/zh_CN.po +++ b/web/src/locales/zh_CN.po @@ -3866,6 +3866,10 @@ msgstr "任务已提交,请在后台任务中查看进度" msgid "Set as CLI Default Version" msgstr "设置为 CLI 默认版本" +#: src/views/environment/PHPView.vue:201 +msgid "View PHPInfo" +msgstr "查看 PHPInfo" + #: src/views/environment/PHPView.vue:203 msgid "This modifies the PHP %{ version } main configuration file. If you do not understand the meaning of each parameter, please do not modify it randomly!" msgstr "这将修改 PHP %{ version } 的主配置文件。如果您不了解每个参数的含义,请不要随意修改!" @@ -6943,3 +6947,7 @@ msgstr "默认密码套件" msgid "Enter the default cipher suite, leave blank to reset to default" msgstr "输入默认密码套件,留空以重置为默认值" +#: src/views/environment/PHPView.vue:294 +msgid "PHPInfo" +msgstr "PHPInfo" + diff --git a/web/src/locales/zh_TW.po b/web/src/locales/zh_TW.po index 21274a48..f5b1e7d7 100644 --- a/web/src/locales/zh_TW.po +++ b/web/src/locales/zh_TW.po @@ -3866,6 +3866,10 @@ msgstr "任務已提交,請在後台任務中查看進度" msgid "Set as CLI Default Version" msgstr "設置為 CLI 默認版本" +#: src/views/environment/PHPView.vue:201 +msgid "View PHPInfo" +msgstr "查看 PHPInfo" + #: src/views/environment/PHPView.vue:203 msgid "This modifies the PHP %{ version } main configuration file. If you do not understand the meaning of each parameter, please do not modify it randomly!" msgstr "這將修改 PHP %{ version } 的主配置文件。如果您不了解每個參數的含義,請不要隨意修改!" @@ -6943,3 +6947,7 @@ msgstr "" msgid "Enter the default cipher suite, leave blank to reset to default" msgstr "" +#: src/views/environment/PHPView.vue:294 +msgid "PHPInfo" +msgstr "PHPInfo" + diff --git a/web/src/views/environment/PHPView.vue b/web/src/views/environment/PHPView.vue index 27726e8b..404a9991 100644 --- a/web/src/views/environment/PHPView.vue +++ b/web/src/views/environment/PHPView.vue @@ -12,6 +12,11 @@ const { $gettext } = useGettext() const currentTab = ref('status') +// phpinfo 相关状态 +const showPHPInfoModal = ref(false) +const phpinfoContent = ref('') +const phpinfoLoading = ref(false) + const { data: config } = useRequest(php.config(slug), { initialData: '' }) @@ -132,6 +137,18 @@ const handleSetCli = async () => { }) } +const handlePHPInfo = async () => { + phpinfoLoading.value = true + showPHPInfoModal.value = true + useRequest(php.phpinfo(slug)) + .onSuccess((res) => { + phpinfoContent.value = res.data + }) + .onComplete(() => { + phpinfoLoading.value = false + }) +} + const handleSaveConfig = async () => { useRequest(php.saveConfig(slug, config.value)).onSuccess(() => { window.$message.success($gettext('Saved successfully')) @@ -180,6 +197,9 @@ const handleUninstallModule = async (module: string) => { {{ $gettext('Set as CLI Default Version') }} + + {{ $gettext('View PHPInfo') }} + @@ -266,7 +286,30 @@ const handleUninstallModule = async (module: string) => { + + + + + +
+
+
+
- + diff --git a/web/src/views/project/CreateModal.vue b/web/src/views/project/CreateModal.vue index af2f8a9e..8f217a82 100644 --- a/web/src/views/project/CreateModal.vue +++ b/web/src/views/project/CreateModal.vue @@ -25,7 +25,7 @@ const phpFrameworks = [ const createModel = ref({ name: '', type: '', - root_dir: '/opt/ace', + root_dir: '/opt/ace/projects', working_dir: '', exec_start: '', user: 'www' @@ -38,7 +38,7 @@ const phpOptions = ref({ }) const showPathSelector = ref(false) -const pathSelectorPath = ref('/opt/ace') +const pathSelectorPath = ref('/opt/ace/projects') const { data: installedEnvironment } = useRequest(home.installedEnvironment, { initialData: { @@ -76,7 +76,7 @@ watch( // 处理目录选择 const handleSelectPath = () => { - pathSelectorPath.value = createModel.value.root_dir || '/opt/ace' + pathSelectorPath.value = createModel.value.root_dir || '/opt/ace/projects' showPathSelector.value = true } @@ -98,7 +98,7 @@ const handleCreate = async () => { createModel.value = { name: '', type: '', - root_dir: '/opt/ace', + root_dir: '/opt/ace/projects', working_dir: '', exec_start: '', user: 'www' diff --git a/web/src/views/project/EditModal.vue b/web/src/views/project/EditModal.vue index ae879adb..88cda6f3 100644 --- a/web/src/views/project/EditModal.vue +++ b/web/src/views/project/EditModal.vue @@ -82,7 +82,7 @@ const pathSelectorTarget = ref<'root_dir' | 'working_dir'>('root_dir') const handleSelectPath = (target: 'root_dir' | 'working_dir') => { pathSelectorTarget.value = target - pathSelectorPath.value = model.value[target] || '/opt/ace' + pathSelectorPath.value = model.value[target] || '/opt/ace/projects' showPathSelector.value = true }