From 2ed5c368901a219fb9bbc6557ccd397e1d7a70ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=97=E5=AD=90?= Date: Thu, 27 Jul 2023 00:57:13 +0800 Subject: [PATCH] feat: add php 81 82 --- .../plugins/php81/php81_controller.go | 371 +++++++++++++++++ .../plugins/php82/php82_controller.go | 365 +++++++++++++++++ app/plugins/php81/php81.go | 13 + app/plugins/php82/php82.go | 13 + app/services/plugin.go | 24 ++ public/panel/views/plugins/php81.html | 381 ++++++++++++++++++ public/panel/views/plugins/php82.html | 381 ++++++++++++++++++ routes/plugin.go | 40 +- 8 files changed, 1587 insertions(+), 1 deletion(-) create mode 100644 app/http/controllers/plugins/php81/php81_controller.go create mode 100644 app/http/controllers/plugins/php82/php82_controller.go create mode 100644 app/plugins/php81/php81.go create mode 100644 app/plugins/php82/php82.go create mode 100644 public/panel/views/plugins/php81.html create mode 100644 public/panel/views/plugins/php82.html diff --git a/app/http/controllers/plugins/php81/php81_controller.go b/app/http/controllers/plugins/php81/php81_controller.go new file mode 100644 index 00000000..f353c2af --- /dev/null +++ b/app/http/controllers/plugins/php81/php81_controller.go @@ -0,0 +1,371 @@ +package php81 + +import ( + "fmt" + "regexp" + "strings" + "time" + + "github.com/goravel/framework/contracts/http" + "github.com/goravel/framework/facades" + "github.com/imroc/req/v3" + + "panel/app/http/controllers" + "panel/app/models" + "panel/app/services" + "panel/pkg/tools" +) + +type Php81Controller struct { + setting services.Setting + task services.Task + version string +} + +func NewPhp81Controller() *Php81Controller { + return &Php81Controller{ + setting: services.NewSettingImpl(), + task: services.NewTaskImpl(), + version: "81", + } +} + +func (c *Php81Controller) Status(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + status := tools.ExecShell("systemctl status php-fpm-" + c.version + " | grep Active | grep -v grep | awk '{print $2}'") + if len(status) == 0 { + controllers.Error(ctx, http.StatusInternalServerError, "获取PHP-"+c.version+"运行状态失败") + return + } + + if status == "active" { + controllers.Success(ctx, true) + } else { + controllers.Success(ctx, false) + } +} + +func (c *Php81Controller) Reload(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + tools.ExecShell("systemctl reload php-fpm-" + c.version) + out := tools.ExecShell("systemctl status php-fpm-" + c.version + " | grep Active | grep -v grep | awk '{print $2}'") + status := strings.TrimSpace(out) + if len(status) == 0 { + controllers.Error(ctx, http.StatusInternalServerError, "获取PHP-"+c.version+"运行状态失败") + return + } + + if status == "active" { + controllers.Success(ctx, true) + } else { + controllers.Success(ctx, false) + } +} + +func (c *Php81Controller) Start(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + tools.ExecShell("systemctl start php-fpm-" + c.version) + out := tools.ExecShell("systemctl status php-fpm-" + c.version + " | grep Active | grep -v grep | awk '{print $2}'") + status := strings.TrimSpace(out) + if len(status) == 0 { + controllers.Error(ctx, http.StatusInternalServerError, "获取PHP-"+c.version+"运行状态失败") + return + } + + if status == "active" { + controllers.Success(ctx, true) + } else { + controllers.Success(ctx, false) + } +} + +func (c *Php81Controller) Stop(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + tools.ExecShell("systemctl stop php-fpm-" + c.version) + out := tools.ExecShell("systemctl status php-fpm-" + c.version + " | grep Active | grep -v grep | awk '{print $2}'") + status := strings.TrimSpace(out) + if len(status) == 0 { + controllers.Error(ctx, http.StatusInternalServerError, "获取PHP-"+c.version+"运行状态失败") + return + } + + if status != "active" { + controllers.Success(ctx, true) + } else { + controllers.Success(ctx, false) + } +} + +func (c *Php81Controller) Restart(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + tools.ExecShell("systemctl restart php-fpm-" + c.version) + out := tools.ExecShell("systemctl status php-fpm-" + c.version + " | grep Active | grep -v grep | awk '{print $2}'") + status := strings.TrimSpace(out) + if len(status) == 0 { + controllers.Error(ctx, http.StatusInternalServerError, "获取PHP-"+c.version+"运行状态失败") + return + } + + if status == "active" { + controllers.Success(ctx, true) + } else { + controllers.Success(ctx, false) + } +} + +func (c *Php81Controller) GetConfig(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + config := tools.ReadFile("/www/server/php/" + c.version + "/etc/php.ini") + controllers.Success(ctx, config) +} + +func (c *Php81Controller) SaveConfig(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + config := ctx.Request().Input("config") + tools.WriteFile("/www/server/php/"+c.version+"/etc/php.ini", config, 0644) + c.Reload(ctx) +} + +func (c *Php81Controller) Load(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + client := req.C().SetTimeout(10 * time.Second) + resp, err := client.R().Get("http://127.0.0.1/phpfpm_status/" + c.version) + if err != nil || !resp.IsSuccessState() { + facades.Log().Error("获取PHP-" + c.version + "运行状态失败") + controllers.Error(ctx, http.StatusInternalServerError, "[PHP-"+c.version+"] 获取运行状态失败") + return + } + + raw := resp.String() + dataKeys := []string{"应用池", "工作模式", "启动时间", "接受连接", "监听队列", "最大监听队列", "监听队列长度", "空闲进程数量", "活动进程数量", "总进程数量", "最大活跃进程数量", "达到进程上限次数", "慢请求"} + regexKeys := []string{"pool", "process manager", "start time", "accepted conn", "listen queue", "max listen queue", "listen queue len", "idle processes", "active processes", "total processes", "max active processes", "max children reached", "slow requests"} + + type Data struct { + Name string `json:"name"` + Value string `json:"value"` + } + data := make([]Data, len(dataKeys)) + for i := range dataKeys { + data[i].Name = dataKeys[i] + + r := regexp.MustCompile(fmt.Sprintf("%s:\\s+(.*)", regexKeys[i])) + match := r.FindStringSubmatch(raw) + + if len(match) > 1 { + data[i].Value = strings.TrimSpace(match[1]) + } + } + + controllers.Success(ctx, data) +} + +func (c *Php81Controller) ErrorLog(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + log := tools.ExecShell("tail -n 100 /www/server/php/" + c.version + "/var/log/php-fpm.log") + controllers.Success(ctx, log) +} + +func (c *Php81Controller) SlowLog(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + log := tools.ExecShell("tail -n 100 /www/server/php/" + c.version + "/var/log/slow.log") + controllers.Success(ctx, log) +} + +func (c *Php81Controller) ClearErrorLog(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + tools.ExecShell("echo '' > /www/server/php/" + c.version + "/var/log/php-fpm.log") + controllers.Success(ctx, true) +} + +func (c *Php81Controller) ClearSlowLog(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + tools.ExecShell("echo '' > /www/server/php/" + c.version + "/var/log/slow.log") + controllers.Success(ctx, true) +} + +type Extension struct { + Name string `json:"name"` + Slug string `json:"slug"` + Description string `json:"description"` + Installed bool `json:"installed"` +} + +func (c *Php81Controller) GetExtensionList(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + extensions := c.GetExtensions() + controllers.Success(ctx, extensions) +} + +func (c *Php81Controller) InstallExtension(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + slug := ctx.Request().Input("slug") + if len(slug) == 0 { + controllers.Error(ctx, http.StatusBadRequest, "参数错误") + return + } + + extensions := c.GetExtensions() + for _, item := range extensions { + if item.Slug == slug { + if item.Installed { + controllers.Error(ctx, http.StatusBadRequest, "扩展已安装") + return + } + + var task models.Task + task.Name = "安装PHP-" + c.version + "扩展-" + item.Name + task.Status = models.TaskStatusWaiting + task.Shell = `bash '/www/panel/scripts/php_extensions/` + item.Slug + `.sh' install ` + c.version + ` >> /tmp/` + item.Slug + `.log 2>&1` + task.Log = "/tmp/" + item.Slug + ".log" + if err := facades.Orm().Query().Create(&task); err != nil { + facades.Log().Error("[PHP-" + c.version + "] 创建安装拓展任务失败:" + err.Error()) + controllers.Error(ctx, http.StatusInternalServerError, "系统内部错误") + return + } + + c.task.Process(task.ID) + + controllers.Success(ctx, true) + return + } + } + + controllers.Error(ctx, http.StatusBadRequest, "扩展不存在") +} + +func (c *Php81Controller) UninstallExtension(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + slug := ctx.Request().Input("slug") + if len(slug) == 0 { + controllers.Error(ctx, http.StatusBadRequest, "参数错误") + return + } + + extensions := c.GetExtensions() + for _, item := range extensions { + if item.Slug == slug { + if !item.Installed { + controllers.Error(ctx, http.StatusBadRequest, "扩展未安装") + return + } + + var task models.Task + task.Name = "卸载PHP-" + c.version + "扩展-" + item.Name + task.Status = models.TaskStatusWaiting + task.Shell = `bash '/www/panel/scripts/php_extensions/` + item.Slug + `.sh' uninstall ` + c.version + ` >> /tmp/` + item.Slug + `.log 2>&1` + task.Log = "/tmp/" + item.Slug + ".log" + if err := facades.Orm().Query().Create(&task); err != nil { + facades.Log().Error("[PHP-" + c.version + "] 创建卸载拓展任务失败:" + err.Error()) + controllers.Error(ctx, http.StatusInternalServerError, "系统内部错误") + return + } + + c.task.Process(task.ID) + + controllers.Success(ctx, true) + return + } + } + + controllers.Error(ctx, http.StatusBadRequest, "扩展不存在") +} + +func (c *Php81Controller) GetExtensions() []Extension { + var extensions []Extension + extensions = append(extensions, Extension{ + Name: "OPcache", + Slug: "Zend OPcache", + Description: "OPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能,存储预编译字节码可以省去每次加载和解析 PHP 脚本的开销。", + Installed: false, + }) + extensions = append(extensions, Extension{ + Name: "PhpRedis", + Slug: "redis", + Description: "PhpRedis 是一个用C语言编写的PHP模块,用来连接并操作 Redis 数据库上的数据。", + Installed: false, + }) + extensions = append(extensions, Extension{ + Name: "ImageMagick", + Slug: "imagick", + Description: "ImageMagick 是一个免费的创建、编辑、合成图片的软件。", + Installed: false, + }) + extensions = append(extensions, Extension{ + Name: "Exif", + Slug: "exif", + Description: "通过 exif 扩展,你可以操作图像元数据。", + Installed: false, + }) + extensions = append(extensions, Extension{ + Name: "pdo_pgsql", + Slug: "pdo_pgsql", + Description: "(需先安装PostgreSQL)pdo_pgsql 是一个驱动程序,它实现了 PHP 数据对象(PDO)接口以启用从 PHP 到 PostgreSQL 数据库的访问。", + Installed: false, + }) + extensions = append(extensions, Extension{ + Name: "ionCube", + Slug: "ionCube Loader", + Description: "ionCube 是一个专业级的PHP加密解密工具。", + Installed: false, + }) + + raw := tools.ExecShell("/www/server/php/" + c.version + "/bin/php -m") + rawExtensionList := strings.Split(raw, "\n") + + for _, item := range rawExtensionList { + if !strings.Contains(item, "[") && item != "" { + for i := range extensions { + if extensions[i].Slug == item { + extensions[i].Installed = true + } + } + } + } + + return extensions +} diff --git a/app/http/controllers/plugins/php82/php82_controller.go b/app/http/controllers/plugins/php82/php82_controller.go new file mode 100644 index 00000000..08d08ed7 --- /dev/null +++ b/app/http/controllers/plugins/php82/php82_controller.go @@ -0,0 +1,365 @@ +package php82 + +import ( + "fmt" + "regexp" + "strings" + "time" + + "github.com/goravel/framework/contracts/http" + "github.com/goravel/framework/facades" + "github.com/imroc/req/v3" + + "panel/app/http/controllers" + "panel/app/models" + "panel/app/services" + "panel/pkg/tools" +) + +type Php82Controller struct { + setting services.Setting + task services.Task + version string +} + +func NewPhp82Controller() *Php82Controller { + return &Php82Controller{ + setting: services.NewSettingImpl(), + task: services.NewTaskImpl(), + version: "82", + } +} + +func (c *Php82Controller) Status(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + status := tools.ExecShell("systemctl status php-fpm-" + c.version + " | grep Active | grep -v grep | awk '{print $2}'") + if len(status) == 0 { + controllers.Error(ctx, http.StatusInternalServerError, "获取PHP-"+c.version+"运行状态失败") + return + } + + if status == "active" { + controllers.Success(ctx, true) + } else { + controllers.Success(ctx, false) + } +} + +func (c *Php82Controller) Reload(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + tools.ExecShell("systemctl reload php-fpm-" + c.version) + out := tools.ExecShell("systemctl status php-fpm-" + c.version + " | grep Active | grep -v grep | awk '{print $2}'") + status := strings.TrimSpace(out) + if len(status) == 0 { + controllers.Error(ctx, http.StatusInternalServerError, "获取PHP-"+c.version+"运行状态失败") + return + } + + if status == "active" { + controllers.Success(ctx, true) + } else { + controllers.Success(ctx, false) + } +} + +func (c *Php82Controller) Start(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + tools.ExecShell("systemctl start php-fpm-" + c.version) + out := tools.ExecShell("systemctl status php-fpm-" + c.version + " | grep Active | grep -v grep | awk '{print $2}'") + status := strings.TrimSpace(out) + if len(status) == 0 { + controllers.Error(ctx, http.StatusInternalServerError, "获取PHP-"+c.version+"运行状态失败") + return + } + + if status == "active" { + controllers.Success(ctx, true) + } else { + controllers.Success(ctx, false) + } +} + +func (c *Php82Controller) Stop(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + tools.ExecShell("systemctl stop php-fpm-" + c.version) + out := tools.ExecShell("systemctl status php-fpm-" + c.version + " | grep Active | grep -v grep | awk '{print $2}'") + status := strings.TrimSpace(out) + if len(status) == 0 { + controllers.Error(ctx, http.StatusInternalServerError, "获取PHP-"+c.version+"运行状态失败") + return + } + + if status != "active" { + controllers.Success(ctx, true) + } else { + controllers.Success(ctx, false) + } +} + +func (c *Php82Controller) Restart(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + tools.ExecShell("systemctl restart php-fpm-" + c.version) + out := tools.ExecShell("systemctl status php-fpm-" + c.version + " | grep Active | grep -v grep | awk '{print $2}'") + status := strings.TrimSpace(out) + if len(status) == 0 { + controllers.Error(ctx, http.StatusInternalServerError, "获取PHP-"+c.version+"运行状态失败") + return + } + + if status == "active" { + controllers.Success(ctx, true) + } else { + controllers.Success(ctx, false) + } +} + +func (c *Php82Controller) GetConfig(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + config := tools.ReadFile("/www/server/php/" + c.version + "/etc/php.ini") + controllers.Success(ctx, config) +} + +func (c *Php82Controller) SaveConfig(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + config := ctx.Request().Input("config") + tools.WriteFile("/www/server/php/"+c.version+"/etc/php.ini", config, 0644) + c.Reload(ctx) +} + +func (c *Php82Controller) Load(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + client := req.C().SetTimeout(10 * time.Second) + resp, err := client.R().Get("http://127.0.0.1/phpfpm_status/" + c.version) + if err != nil || !resp.IsSuccessState() { + facades.Log().Error("获取PHP-" + c.version + "运行状态失败") + controllers.Error(ctx, http.StatusInternalServerError, "[PHP-"+c.version+"] 获取运行状态失败") + return + } + + raw := resp.String() + dataKeys := []string{"应用池", "工作模式", "启动时间", "接受连接", "监听队列", "最大监听队列", "监听队列长度", "空闲进程数量", "活动进程数量", "总进程数量", "最大活跃进程数量", "达到进程上限次数", "慢请求"} + regexKeys := []string{"pool", "process manager", "start time", "accepted conn", "listen queue", "max listen queue", "listen queue len", "idle processes", "active processes", "total processes", "max active processes", "max children reached", "slow requests"} + + type Data struct { + Name string `json:"name"` + Value string `json:"value"` + } + data := make([]Data, len(dataKeys)) + for i := range dataKeys { + data[i].Name = dataKeys[i] + + r := regexp.MustCompile(fmt.Sprintf("%s:\\s+(.*)", regexKeys[i])) + match := r.FindStringSubmatch(raw) + + if len(match) > 1 { + data[i].Value = strings.TrimSpace(match[1]) + } + } + + controllers.Success(ctx, data) +} + +func (c *Php82Controller) ErrorLog(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + log := tools.ExecShell("tail -n 100 /www/server/php/" + c.version + "/var/log/php-fpm.log") + controllers.Success(ctx, log) +} + +func (c *Php82Controller) SlowLog(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + log := tools.ExecShell("tail -n 100 /www/server/php/" + c.version + "/var/log/slow.log") + controllers.Success(ctx, log) +} + +func (c *Php82Controller) ClearErrorLog(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + tools.ExecShell("echo '' > /www/server/php/" + c.version + "/var/log/php-fpm.log") + controllers.Success(ctx, true) +} + +func (c *Php82Controller) ClearSlowLog(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + tools.ExecShell("echo '' > /www/server/php/" + c.version + "/var/log/slow.log") + controllers.Success(ctx, true) +} + +type Extension struct { + Name string `json:"name"` + Slug string `json:"slug"` + Description string `json:"description"` + Installed bool `json:"installed"` +} + +func (c *Php82Controller) GetExtensionList(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + extensions := c.GetExtensions() + controllers.Success(ctx, extensions) +} + +func (c *Php82Controller) InstallExtension(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + slug := ctx.Request().Input("slug") + if len(slug) == 0 { + controllers.Error(ctx, http.StatusBadRequest, "参数错误") + return + } + + extensions := c.GetExtensions() + for _, item := range extensions { + if item.Slug == slug { + if item.Installed { + controllers.Error(ctx, http.StatusBadRequest, "扩展已安装") + return + } + + var task models.Task + task.Name = "安装PHP-" + c.version + "扩展-" + item.Name + task.Status = models.TaskStatusWaiting + task.Shell = `bash '/www/panel/scripts/php_extensions/` + item.Slug + `.sh' install ` + c.version + ` >> /tmp/` + item.Slug + `.log 2>&1` + task.Log = "/tmp/" + item.Slug + ".log" + if err := facades.Orm().Query().Create(&task); err != nil { + facades.Log().Error("[PHP-" + c.version + "] 创建安装拓展任务失败:" + err.Error()) + controllers.Error(ctx, http.StatusInternalServerError, "系统内部错误") + return + } + + c.task.Process(task.ID) + + controllers.Success(ctx, true) + return + } + } + + controllers.Error(ctx, http.StatusBadRequest, "扩展不存在") +} + +func (c *Php82Controller) UninstallExtension(ctx http.Context) { + if !controllers.Check(ctx, "php"+c.version) { + return + } + + slug := ctx.Request().Input("slug") + if len(slug) == 0 { + controllers.Error(ctx, http.StatusBadRequest, "参数错误") + return + } + + extensions := c.GetExtensions() + for _, item := range extensions { + if item.Slug == slug { + if !item.Installed { + controllers.Error(ctx, http.StatusBadRequest, "扩展未安装") + return + } + + var task models.Task + task.Name = "卸载PHP-" + c.version + "扩展-" + item.Name + task.Status = models.TaskStatusWaiting + task.Shell = `bash '/www/panel/scripts/php_extensions/` + item.Slug + `.sh' uninstall ` + c.version + ` >> /tmp/` + item.Slug + `.log 2>&1` + task.Log = "/tmp/" + item.Slug + ".log" + if err := facades.Orm().Query().Create(&task); err != nil { + facades.Log().Error("[PHP-" + c.version + "] 创建卸载拓展任务失败:" + err.Error()) + controllers.Error(ctx, http.StatusInternalServerError, "系统内部错误") + return + } + + c.task.Process(task.ID) + + controllers.Success(ctx, true) + return + } + } + + controllers.Error(ctx, http.StatusBadRequest, "扩展不存在") +} + +func (c *Php82Controller) GetExtensions() []Extension { + var extensions []Extension + extensions = append(extensions, Extension{ + Name: "OPcache", + Slug: "Zend OPcache", + Description: "OPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能,存储预编译字节码可以省去每次加载和解析 PHP 脚本的开销。", + Installed: false, + }) + extensions = append(extensions, Extension{ + Name: "PhpRedis", + Slug: "redis", + Description: "PhpRedis 是一个用C语言编写的PHP模块,用来连接并操作 Redis 数据库上的数据。", + Installed: false, + }) + extensions = append(extensions, Extension{ + Name: "ImageMagick", + Slug: "imagick", + Description: "ImageMagick 是一个免费的创建、编辑、合成图片的软件。", + Installed: false, + }) + extensions = append(extensions, Extension{ + Name: "Exif", + Slug: "exif", + Description: "通过 exif 扩展,你可以操作图像元数据。", + Installed: false, + }) + extensions = append(extensions, Extension{ + Name: "pdo_pgsql", + Slug: "pdo_pgsql", + Description: "(需先安装PostgreSQL)pdo_pgsql 是一个驱动程序,它实现了 PHP 数据对象(PDO)接口以启用从 PHP 到 PostgreSQL 数据库的访问。", + Installed: false, + }) + + raw := tools.ExecShell("/www/server/php/" + c.version + "/bin/php -m") + rawExtensionList := strings.Split(raw, "\n") + + for _, item := range rawExtensionList { + if !strings.Contains(item, "[") && item != "" { + for i := range extensions { + if extensions[i].Slug == item { + extensions[i].Installed = true + } + } + } + } + + return extensions +} diff --git a/app/plugins/php81/php81.go b/app/plugins/php81/php81.go new file mode 100644 index 00000000..266b24ed --- /dev/null +++ b/app/plugins/php81/php81.go @@ -0,0 +1,13 @@ +package php81 + +var ( + Name = "PHP-8.1" + Description = "PHP 是世界上最好的语言!" + Slug = "php81" + Version = "8.1.21" + Requires = []string{} + Excludes = []string{} + Install = `bash /www/panel/scripts/php/install.sh 81` + Uninstall = `bash /www/panel/scripts/php/uninstall.sh 81` + Update = `bash /www/panel/scripts/php/install.sh 81` +) diff --git a/app/plugins/php82/php82.go b/app/plugins/php82/php82.go new file mode 100644 index 00000000..8a60ec41 --- /dev/null +++ b/app/plugins/php82/php82.go @@ -0,0 +1,13 @@ +package php82 + +var ( + Name = "PHP-8.2" + Description = "PHP 是世界上最好的语言!" + Slug = "php82" + Version = "8.2.8" + Requires = []string{} + Excludes = []string{} + Install = `bash /www/panel/scripts/php/install.sh 82` + Uninstall = `bash /www/panel/scripts/php/uninstall.sh 82` + Update = `bash /www/panel/scripts/php/install.sh 82` +) diff --git a/app/services/plugin.go b/app/services/plugin.go index d8bf7d1a..e2a91cac 100644 --- a/app/services/plugin.go +++ b/app/services/plugin.go @@ -10,6 +10,8 @@ import ( "panel/app/plugins/openresty" "panel/app/plugins/php74" "panel/app/plugins/php80" + "panel/app/plugins/php81" + "panel/app/plugins/php82" "panel/app/plugins/phpmyadmin" "panel/app/plugins/s3fs" "panel/app/plugins/supervisor" @@ -111,6 +113,28 @@ func (r *PluginImpl) All() []PanelPlugin { Uninstall: php80.Uninstall, Update: php80.Update, }) + p = append(p, PanelPlugin{ + Name: php81.Name, + Description: php81.Description, + Slug: php81.Slug, + Version: php81.Version, + Requires: php81.Requires, + Excludes: php81.Excludes, + Install: php81.Install, + Uninstall: php81.Uninstall, + Update: php81.Update, + }) + p = append(p, PanelPlugin{ + Name: php82.Name, + Description: php82.Description, + Slug: php82.Slug, + Version: php82.Version, + Requires: php82.Requires, + Excludes: php82.Excludes, + Install: php82.Install, + Uninstall: php82.Uninstall, + Update: php82.Update, + }) p = append(p, PanelPlugin{ Name: phpmyadmin.Name, Description: phpmyadmin.Description, diff --git a/public/panel/views/plugins/php81.html b/public/panel/views/plugins/php81.html new file mode 100644 index 00000000..90eb683f --- /dev/null +++ b/public/panel/views/plugins/php81.html @@ -0,0 +1,381 @@ + +PHP-8.1 +
+
+
+
+
PHP-8.1管理
+
+
+
    +
  • 运行状态
  • +
  • 拓展管理
  • +
  • 配置修改
  • +
  • 负载状态
  • +
  • 运行日志
  • +
  • 慢日志
  • +
+
+
+
当前状态:获取中
+
+ + + + +
+
+
+
+ + +
+
+
此处修改的是PHP主配置文件,如果你不了解各参数的含义,请不要随意修改!
+ 提示:Ctrl+F 搜索关键字,Ctrl+S 保存,Ctrl+H 查找替换! +
+
+
+ +
+
+
+
+
+
+
+ +
+
+                                    获取中...
+                                
+
+
+
+ +
+
+                                    获取中...
+                                
+
+
+
+
+
+
+
+
+ + diff --git a/public/panel/views/plugins/php82.html b/public/panel/views/plugins/php82.html new file mode 100644 index 00000000..64188dde --- /dev/null +++ b/public/panel/views/plugins/php82.html @@ -0,0 +1,381 @@ + +PHP-8.2 +
+
+
+
+
PHP-8.2管理
+
+
+
    +
  • 运行状态
  • +
  • 拓展管理
  • +
  • 配置修改
  • +
  • 负载状态
  • +
  • 运行日志
  • +
  • 慢日志
  • +
+
+
+
当前状态:获取中
+
+ + + + +
+
+
+
+ + +
+
+
此处修改的是PHP主配置文件,如果你不了解各参数的含义,请不要随意修改!
+ 提示:Ctrl+F 搜索关键字,Ctrl+S 保存,Ctrl+H 查找替换! +
+
+
+ +
+
+
+
+
+
+
+ +
+
+                                    获取中...
+                                
+
+
+
+ +
+
+                                    获取中...
+                                
+
+
+
+
+
+
+
+
+ + diff --git a/routes/plugin.go b/routes/plugin.go index 567e0336..b047d782 100644 --- a/routes/plugin.go +++ b/routes/plugin.go @@ -3,15 +3,17 @@ package routes import ( "github.com/goravel/framework/contracts/route" "github.com/goravel/framework/facades" - "panel/app/http/controllers/plugins/supervisor" "panel/app/http/controllers/plugins/mysql57" "panel/app/http/controllers/plugins/mysql80" "panel/app/http/controllers/plugins/openresty" "panel/app/http/controllers/plugins/php74" "panel/app/http/controllers/plugins/php80" + "panel/app/http/controllers/plugins/php81" + "panel/app/http/controllers/plugins/php82" "panel/app/http/controllers/plugins/phpmyadmin" "panel/app/http/controllers/plugins/s3fs" + "panel/app/http/controllers/plugins/supervisor" "panel/app/http/middleware" ) @@ -126,6 +128,42 @@ func Plugin() { route.Post("installExtension", php80Controller.InstallExtension) route.Post("uninstallExtension", php80Controller.UninstallExtension) }) + facades.Route().Prefix("api/plugins/php81").Middleware(middleware.Jwt()).Group(func(route route.Route) { + php81Controller := php81.NewPhp81Controller() + route.Get("status", php81Controller.Status) + route.Post("reload", php81Controller.Reload) + route.Post("start", php81Controller.Start) + route.Post("stop", php81Controller.Stop) + route.Post("restart", php81Controller.Restart) + route.Get("load", php81Controller.Load) + route.Get("config", php81Controller.GetConfig) + route.Post("config", php81Controller.SaveConfig) + route.Get("errorLog", php81Controller.ErrorLog) + route.Get("slowLog", php81Controller.SlowLog) + route.Post("clearErrorLog", php81Controller.ClearErrorLog) + route.Post("clearSlowLog", php81Controller.ClearSlowLog) + route.Get("extensions", php81Controller.GetExtensionList) + route.Post("installExtension", php81Controller.InstallExtension) + route.Post("uninstallExtension", php81Controller.UninstallExtension) + }) + facades.Route().Prefix("api/plugins/php82").Middleware(middleware.Jwt()).Group(func(route route.Route) { + php82Controller := php82.NewPhp82Controller() + route.Get("status", php82Controller.Status) + route.Post("reload", php82Controller.Reload) + route.Post("start", php82Controller.Start) + route.Post("stop", php82Controller.Stop) + route.Post("restart", php82Controller.Restart) + route.Get("load", php82Controller.Load) + route.Get("config", php82Controller.GetConfig) + route.Post("config", php82Controller.SaveConfig) + route.Get("errorLog", php82Controller.ErrorLog) + route.Get("slowLog", php82Controller.SlowLog) + route.Post("clearErrorLog", php82Controller.ClearErrorLog) + route.Post("clearSlowLog", php82Controller.ClearSlowLog) + route.Get("extensions", php82Controller.GetExtensionList) + route.Post("installExtension", php82Controller.InstallExtension) + route.Post("uninstallExtension", php82Controller.UninstallExtension) + }) facades.Route().Prefix("api/plugins/phpmyadmin").Middleware(middleware.Jwt()).Group(func(route route.Route) { phpMyAdminController := phpmyadmin.NewPhpMyAdminController() route.Get("info", phpMyAdminController.Info)