当前位置: 首页 > news >正文

electron-egg使用ThinkPHP项目指南

electron-egg使用ThinkPHP项目指南

示例demo

https://github.com/jhs1873/electron-egg-tp

🧑‍💻 User

electron-egg 使用thinkphp


🤖 Assistant

在基于 electron-egg 的项目中使用 ThinkPHP,是指将 ThinkPHP 框架作为后端服务,同时通过 electron-egg 提供前端界面和打包能力。具体实现可以参考以下步骤。


前置知识

  1. Electron-egg 是一个结合了 Electron 和 Egg.js 的完整解决方案,用来在桌面端构建全栈应用。
  2. ThinkPHP 是一个 PHP 框架,用作后端 API 服务,接收来自 Electron 前端 (即 local 客户端) 发出的请求。

主要任务

  1. 启动 ThinkPHP 后端服务。
  2. 在 Electron 主进程和渲染进程中与 ThinkPHP API 交互。
  3. 优化本地调试和打包时的流程。

完整实现步骤

1. 准备环境

确保您已经安装以下工具:

  • Node.js v16.20.0 (Electron 使用)
  • PHP (至少7.2+,ThinkPHP 依赖)
  • Composer (用于安装 ThinkPHP 项目)

2. 创建项目

下拉 electron-egg

git clone https://gitee.com/dromara/electron-egg.gitcd electron-egggit checkout -b demo remotes/origin/demonpm installcd frontendnpm install
  • electron-egg 安装问题查看文档

3. 添加 ThinkPHP 后端服务

将 ThinkPHP 安装到项目中。此处以 api 作为子目录部署 ThinkPHP:

# 进入您的工程根目录cd electron-egg# 使用 Composer 安装 ThinkPHP
composer create-project topthink/think api

设置 PHP 开发服务器

进入 api 目录,启动 PHP 的内置开发服务器 (例如用于调试):

cd api
php think run

此时,ThinkPHP 服务将在默认的 http://127.0.0.1:8000 启动。


4. Electron 与 ThinkPHP 通信

修改frontend目录

.env.development修改

VITE_GO_URL="http://localhost:8000"

frontend\src\views\framework\socket\HttpServer.vue 行91

/hello 改为 /index

调用示例

在打开的窗口中 框架->http服务 2. 使用http与服务端通信 点击发送请求按钮

这样,点击页面按钮后便可以通过 Electron 渲染进程调用 ThinkPHP 后端的接口。


5. 生产环境部署

前后端本地通信

由于 Electron 应用会被打包到本地运行,PHP 服务也需要被带到本地运行环境中。可以通过以下两种方式处理:

  1. PHP 内核 + 本地服务:将 PHP 和 ThinkPHP 服务打包到本地,Electron 启动时通过 Node.js 调用 php 运行内置 Web 开发服务器。
  2. 使用第三方 API 网关:将 ThinkPHP 的服务托管到外部服务器(如部署在云端),Electron 直接调用云端 API。

实现方式一:本地集成 PHP 服务

在 Electron 主进程中,启动一个 PHP 的子进程 在 electron/service/cross.js

/*** create thinkphp service* 启动ThinkPHP服务进程*/async createThinkphpServer() {const serviceName = "tp";const opt = {name: 'tpapi',// 修改:直接使用 PHP 可执行文件作为 cmdcmd: path.join(Ps.getExtraResourcesDir(), 'php-7.3/php'),// 修改:设置正确的工作目录directory: path.join(Ps.getExtraResourcesDir(), 'api'),// 修改:调整参数格式args: ['think', 'run', '--port=8000'],appExit: true,}const entity = await Cross.run(serviceName, opt);Log.info('server name:', entity.name);Log.info('server config:', entity.config);Log.info('server url:', Cross.getUrl(entity.name));return;
}

electron/preload/index.js 行19 新增

  Services.get('cross').createThinkphpServer();

build/extraResources 引入php-7.3程序 在 electron-egg 项目运行时,PHP 服务启动于本地 127.0.0.1:8000


实现方式二:云端部署 ThinkPHP

简单地把 PHP/ThinkPHP 部署到服务器,然后前端请求地址改成云端的 API 地址 (http://yourdomain.com/api)。

例如: frontend/.env.production

VITE_GO_URL = 'http://yourdomain.com'; // 云端地址

这样无需捆绑 PHP,减少本地应用的复杂程度。


总结

  • ThinkPHP 可以作为后端服务,一个本地的 PHP 服务器运行于 Electron 环境。
  • electron-egg 的前端和后端可以通过 HTTP 请求使用 axios 或 fetch 和 ThinkPHP API 进行通信。
  • 生产环境中可以选择打包 PHP 到离线环境,或直接使用云后端解决方案,取决于具体项目需求。

🧑‍💻 User

如果使用了thinkphp 那么egg的作用是什么 是不是就不需要了


🤖 Assistant

在使用 ThinkPHP 作为后端框架的同时,如果你已经引入了 electron-egg(基于 Egg.js),会造成一个问题:系统中已经有两个后端框架(ThinkPHP 和 Egg.js),导致架构的复杂性增加。因此需要仔细思考和规划系统的实际需求,决定是否真的需要继续保留 Egg.js 的功能。

下面分析一下两者的作用,以及哪些情况可以直接移除 Egg.js。


ThinkPHP 和 Egg.js 的主要职责

  • ThinkPHP
    • ThinkPHP 是一种 PHP 框架,传统上用于开发 Web 应用或 API 服务。
    • 如果您已经使用 ThinkPHP 来搭建后端 API,那么意味着所有与业务相关的数据库、逻辑处理、接口输出都会由 ThinkPHP 提供。
    • 在 electron-egg 项目中,ThinkPHP 更像是完全独立的后端服务。
  • Egg.js
    • Egg.js 是 Node.js 的框架,在 electron-egg 中,它默认作为 Electron 框架的本地后端服务。
    • Egg.js 服务直接运行于 Electron 进程中,用于管理内部的本地请求、文件读取、提供 API 服务等任务。
    • 在某些 Electron 应用中,Egg.js 可用于承担业务逻辑(替代 PHP 或其他 API)。

当你引入 ThinkPHP 时,Egg.js 还能有什么作用?

如果后端服务完全交给 ThinkPHP 来处理,那么 Egg.js 的核心价值可能就大幅下降。但仍然有一些场景下,Egg.js 能发挥作用:

1. 适配自定义 Node.js 功能

Egg.js 本质上是一个 Node.js 框架,可以运行在 Electron 应用的本地环境中。它可以用来处理一些本地功能,而这些功能并非 ThinkPHP 的强项,例如:

  • 控制本地文件系统(读写、上传、下载等操作)。
  • 调用系统命令行接口(如调用 ffmpeg 转码,或其他本地脚本)。
  • 功能性的插件(如 WebSocket 服务、定时任务)。
  • 本地数据持久化(如读取、写入配置文件)。

2. 作为 ThinkPHP 服务的代理

Egg.js 可以作为一个中间代理层:

  • 当 Electron 渲染进程(前端)发起请求时,Egg.js 可以接收请求并转发到本地运行的 ThinkPHP 服务。
  • 这样可以隐藏 ThinkPHP 服务的运行细节,同时提升安全性(前端不知道后端的真实地址或端口)。
  • 通过这种方式,你还能灵活地增加请求的拦截器、权限校验、缓存等功能。

3. 提供前后端一体化功能

如果你的桌面应用有多个 API 源:

  • 考虑到 ThinkPHP 主要处理数据库相关的核心业务逻辑,Egg.js 可以用来处理一些与 Electron 桌面应用耦合较强的 API(如本地通知、本地用户权限管理等)。
  • Egg.js 可以与 Electron 渲染进程使用类似 ipcMain/ipcRenderer 的机制,提供一种单独的逻辑层。

4. 分工与模块化

在复杂应用中,可能需要多个层次的 API 服务。你可以用 Egg.js 和 ThinkPHP 分工:

  • Egg.js:负责本地服务和前后端交互。
  • ThinkPHP:负责业务逻辑和数据库处理。

哪些情况可以直接移除 Egg.js?

如果你的项目目标非常简单,例如:

  1. 纯粹的数据库/业务接口由 ThinkPHP 提供服务,且不涉及任何本地服务逻辑。
  2. 你的桌面应用功能不需要用到其他本地 API。
  3. 你的 Electron 应用前后端通信可以直接通过 AJAX 或 WebSocket 与 ThinkPHP 通信(而不是通过 Egg.js 转发)。

这种情况下,Egg.js 服务的作用可以完全由 ThinkPHP 取代,那么直接移除 Egg.js 是完全可以的。


移除 Egg.js 后的架构示例

如果移除了 Egg.js,本地架构会变得简单:

  1. 后端服务:ThinkPHP 提供所有的后端 API(本地运行的 PHP 内置服务,或远程云端服务)。
  2. Electron 主进程
    • 负责启动 ThinkPHP 服务(通过 php 子进程)。
    • 管理应用生命周期。
  3. Electron 渲染进程
    • 前端页面直接通过 AJAX 或 fetch 与 ThinkPHP API 通信,获取和推送数据。

整体系统的请求流如下:

Electron 前端 --> ThinkPHP API 服务

保留 Egg.js 的架构示例

如果 ThinkPHP 和 Egg.js 同时存在,你可以定义它们的职责边界,以支持更复杂的需求:

  1. ThinkPHP:
    • 提供主要的业务逻辑(如用户登录、订单管理、数据存储等)。
    • ThinkPHP 运行在一个本地的 PHP 服务器上,由 Electron 主进程启动。
  2. Egg.js:
    • 提供本地化服务,比如文件系统操作、调用系统 API 或管理 Electron 的进程、窗口等。
    • 作为代理或中间层,将部分请求转发到 ThinkPHP,从而对 ThinkPHP 服务进行“封装”。

请求流示例:

  1. Electron 前端调用 Egg.js 的接口(本地主机 http://127.0.0.1:7001)。
  2. Egg.js 根据请求决定:
    • 是否处理请求(如文件操作、通知管理)。
    • 或者将请求转发给 ThinkPHP 并返回其响应。
Electron 前端 --> Egg.js 服务 --> ThinkPHP 服务

结论

  1. 移除 Egg.js 的推荐场景:
    • 如果 ThinkPHP 可以完全满足您的所有后端 API 需求,并且不需要本地 API 或代理层。
    • 您希望项目架构精简,便于维护。
  2. 保留 Egg.js 的推荐场景:
    • 如果项目中有较多本地功能需要实现(本地文件系统、通知、系统调用保护等)。
    • 如果需要一个代理层来封装或增强 ThinkPHP 提供的服务。
    • 如果打算长期扩展项目,Egg.js 可以兼容未来更多 Node.js 插件或功能。

根据实际需求选择合适的架构,可以大幅降低开发和后续维护成本。


ThinkPHP伪静态

  • ThinkPHP 默认支持伪静态,只需结合服务器环境(Apache、Nginx、IIS 或 PHP 内置服务器)配置好对应的 URL 重写规则即可。
  • 开发环境中,直接运行 php think run,伪静态 URL 通常无需额外配置。
  • 生产环境中,一般推荐使用 Nginx 或 Apache 配置伪静态,避免暴露入口文件(如 index.php),从而让 URL 更加优雅、美观,并对 SEO 友好。

使用ai询问,然后手动实践,再修改文档.过程耗时将近2小时.算是初步的electron-egg 可以引入thinkphp来使用了. (electron-egg 引入tp的意义就是在于折腾.)

打包目前只测了win平台.

打包构建前需要把api目录移动到build/extraResources目录下(可以手动移动或者使用命令移动)

php.exe后面可以更换成 static-php-cli

thinkphp构建成phar

php启动动态端口,前端动态获取php执行端口.

当然这些玩法需要折腾,使用内置的node 或者集成好的go也是不错的选择.


文章转载自:

http://6mC4OXND.Lmctj.cn
http://XxynIwVT.Lmctj.cn
http://VsB6ykco.Lmctj.cn
http://FUQimsYK.Lmctj.cn
http://PAXu09vw.Lmctj.cn
http://vbJmhZkn.Lmctj.cn
http://vON5uf3F.Lmctj.cn
http://WobuyeDz.Lmctj.cn
http://sDdrpbTQ.Lmctj.cn
http://nQsNxreR.Lmctj.cn
http://jJtSogt4.Lmctj.cn
http://dOVE8rRB.Lmctj.cn
http://TMeCZ8hG.Lmctj.cn
http://tPg0iq21.Lmctj.cn
http://AhaOfm0e.Lmctj.cn
http://VUipwUGn.Lmctj.cn
http://y0l7TmpH.Lmctj.cn
http://L5Gp3TOq.Lmctj.cn
http://JdV8Diet.Lmctj.cn
http://k7gS8ZLe.Lmctj.cn
http://whJoWDJn.Lmctj.cn
http://STRem6ot.Lmctj.cn
http://wB7nn0Oh.Lmctj.cn
http://Y3NXfKm0.Lmctj.cn
http://UIpAg3Ab.Lmctj.cn
http://YPtIvoVm.Lmctj.cn
http://RaQQFclf.Lmctj.cn
http://G0HaRcqq.Lmctj.cn
http://24cnwDb6.Lmctj.cn
http://V4Gmlaey.Lmctj.cn
http://www.dtcms.com/a/387583.html

相关文章:

  • 温州工业自动化科技工厂如何实现1台服务器10个研发设计同时用
  • 如何用PM2托管静态文件
  • Java程序设计:基本数据类型
  • 在k8s环境下部署kanboard项目管理平台
  • 为什么 MySQL utf8 存不下 Emoji?utf8mb4 实战演示
  • 2025 年 PHP 常见面试题整理以及对应答案和代码示例
  • (二十五)、在 k8s 中部署证书,为网站增加https安全认证
  • 风机巡检目前有什么新技术?
  • 震坤行工业超市开放平台接口实战:工业品精准检索与详情解析全方案
  • 河南萌新联赛2025第(八)场:南阳理工学院
  • docker回收和mysql备份导入导致数据丢失恢复---惜分飞
  • 「Memene 摸鱼日报 2025.9.17」上海张江人工智能创新小镇正式启动,华为 DCP 技术获网络顶会奖项
  • 【数据结构】顺序表,ArrayList
  • 第十二章 Arm C1-Premium GIC CPU接口详解
  • 【数据结构---并查集】(并查集的原理,实现与应用)
  • 【数据结构-KMP算法(学习篇)】
  • Start application catch exception
  • 机器视觉在半导体封装检测中的应用
  • 雅菲奥朗SRE知识墙分享(九):『变更管理的定义与实践』
  • 51c视觉~3D~合集6
  • webRTC 的协议族
  • 线激光相机 眼在手上六轴机器人手眼标定 备忘记录
  • QML学习笔记(一)基本了解和工程配置
  • 大数据毕业设计选题推荐-基于大数据的牛油果数据可视化分析系统-Hadoop-Spark-数据可视化-BigData
  • Hadoop单机模式下运行grep实例,output文件目录不存在
  • 【docker】清理中断构建后产生的镜像和缓存
  • Vue2项目集成打包分析工具webpack-bundle-analyzer
  • 【阶梯波发生器如何控制电压和周期】2022-12-9
  • Java 设计模式之桥接模式(Bridge Pattern)
  • Android 端启动 HTTP 服务:从基础实现到实战应用