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

PHP跨平台桌面应用开发实践

PHP跨平台桌面应用开发实践

PHP通常用于Web开发,但也可以用来开发桌面应用。结合PHP Desktop或Electron + PHP后端,可以构建跨平台桌面应用。今天说说PHP桌面应用开发的方案。

PHP Desktop是一个将PHP应用打包成桌面应用的解决方案。它内嵌了一个Web服务器和浏览器窗口。

```php
// PHP Desktop应用的入口文件
$app = new \PHPDesktop\Application([
'name' => 'My Desktop App',
'width' => 1024,
'height' => 768,
'resizable' => true,
'fullscreen' => false,
'console' => false,
]);

// 注册路由
$app->get('/', function () {
return <<


桌面应用

PHP桌面应用


点击


HTML;
});

$app->get('/api/data', function () {
header('Content-Type: application/json');
return json_encode(['status' => 'ok', 'data' => [1, 2, 3]]);
});

$app->run();
?>
```

用PHP做桌面应用的API后端,前端用HTML/JS渲染:

```php
// 本地文件操作API
class LocalFileAPI
{
public function readFile(string $path): array
{
if (!file_exists($path)) {
return ['error' => '文件不存在'];
}

return [
'content' => file_get_contents($path),
'size' => filesize($path),
'modified' => date('Y-m-d H:i:s', filemtime($path)),
];
}

public function writeFile(string $path, string $content): array
{
$result = file_put_contents($path, $content);
if ($result === false) {
return ['error' => '写入失败'];
}
return ['success' => true, 'bytes' => $result];
}

public function listDirectory(string $path): array
{
if (!is_dir($path)) {
return ['error' => '目录不存在'];
}

$items = scandir($path);
$files = [];

foreach ($items as $item) {
if ($item === '.' || $item === '..') continue;
$fullPath = $path . '/' . $item;
$files[] = [
'name' => $item,
'type' => is_dir($fullPath) ? 'dir' : 'file',
'size' => is_file($fullPath) ? filesize($fullPath) : 0,
'modified' => date('Y-m-d H:i:s', filemtime($fullPath)),
];
}

return $files;
}

public function createDirectory(string $path): array
{
if (is_dir($path)) {
return ['error' => '目录已存在'];
}

$result = mkdir($path, 0755, true);
return ['success' => $result];
}

public function deleteFile(string $path): array
{
if (!file_exists($path)) {
return ['error' => '文件不存在'];
}

$result = is_dir($path) ? rmdir($path) : unlink($path);
return ['success' => $result];
}
}
?>
```

Electron + PHP的桌面应用:

```javascript
// main.js (Electron主进程)
const { app, BrowserWindow, ipcMain } = require('electron');
const { spawn } = require('child_process');
const path = require('path');

let phpProcess;
let mainWindow;

function startPHPServer() {
phpProcess = spawn('php', [
'-S', '127.0.0.1:8080',
'-t', path.join(__dirname, 'public'),
path.join(__dirname, 'server.php')
]);

phpProcess.stdout.on('data', (data) => {
console.log(`PHP: ${data}`);
});
}

function createWindow() {
mainWindow = new BrowserWindow({
width: 1200,
height: 800,
webPreferences: {
nodeIntegration: true,
contextIsolation: false,
}
});

mainWindow.loadURL('http://127.0.0.1:8080');
}

app.whenReady().then(() => {
startPHPServer();
setTimeout(createWindow, 1000);
});

app.on('window-all-closed', () => {
if (phpProcess) phpProcess.kill();
app.quit();
});
```

PHP桌面应用的API层:

```php
// server.php
$route = $_SERVER['REQUEST_URI'];
$method = $_SERVER['REQUEST_METHOD'];

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');
header('Content-Type: application/json; charset=utf-8');

// 获取系统信息
if ($route === '/api/system/info') {
echo json_encode([
'os' => PHP_OS,
'php_version' => PHP_VERSION,
'hostname' => gethostname(),
'memory' => [
'usage' => round(memory_get_usage(true) / 1024 / 1024, 2) . 'MB',
'peak' => round(memory_get_peak_usage(true) / 1024 / 1024, 2) . 'MB',
],
]);
exit;
}

// 数据库管理
if (str_starts_with($route, '/api/database')) {
$action = $_GET['action'] ?? '';
if ($action === 'tables') {
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$tables = $pdo->query('SHOW TABLES')->fetchAll(PDO::FETCH_COLUMN);
echo json_encode(['tables' => $tables]);
exit;
}
}

echo json_encode(['error' => 'Route not found']);
exit;
?>
```

虽然PHP不是桌面应用的主流语言,但在一些工具类的桌面应用中,PHP结合内嵌浏览器或Electron可以实现快速开发。PHP负责后端逻辑和数据处理,前端负责界面展示,各司其职。

http://www.jsqmd.com/news/947738/

相关文章:

  • 零代码打通ERP+MES+WMS,这套集成方案把我从“接口地狱”里捞了出来
  • 【HarmonyOS 6.0】Map Kit 进阶:基于 MVT 矢量图层的动态地图数据叠加方案
  • 魔都黄金回收优质店铺盘点,深耕上海多年,综合排名第一门店变现首选 - 奢侈品回收测评
  • 从Java字节码到十六进制:手把手教你破解一个密码管理器的试用限制
  • 2026最新昭通市本地黄金铂金白银彩金回收服务 五大黄金靠谱回收门店汇总,正规渠道对比推荐及联系方式 - 前途无量YY
  • 高性能并发之术:从 C++20 原子模型到 Qt6 的线程之道
  • [智能体-224]:LangGraph的记忆载体State与Checkpointer机制详解,代码示例
  • GHelper技术解析:华硕笔记本硬件控制的轻量级替代方案
  • Qwen3.6-Plus实战指南:多模态编程搭档与Agent工作流落地
  • 从防御者视角拆解:那些年我们遇到的VBS脚本“恶作剧”与批处理病毒
  • 想考PMP不知道怎么选机构?PMP主流培训机构通过率实力与购买性价比分析 - 资讯焦点
  • 沪上黄金回收专业测评,光谱仪当面验金,本地头部实体店强烈推荐 - 奢侈品回收测评
  • 工厂智能化改造(四):现场总线、无线通信与抗干扰布线
  • 2026最新肇庆市本地黄金铂金白银彩金回收服务 五大黄金靠谱回收门店汇总,正规渠道对比推荐及联系方式 - 前途无量YY
  • 别再死记硬背VAE公式了!用PyTorch手搓一个MNIST生成器,带你直观理解隐变量
  • 用Python和jieba做个年报“阅读难度”检测器:从会计词到转折词,手把手教你量化文本复杂度
  • 别再群发“亲爱的用户”了!一招让微信消息自动带上好友昵称,打开率飙升300%
  • 别再手动算面积了!用ArcPy的AddGeometryAttributes函数一键搞定GIS属性表
  • 避坑指南:ABB机器人PC SDK开发中,网络扫描与连接的那些‘坑’(C#/.NET实战)
  • 2026 年 6 月韶关防水维修机构甄选指南:卫生间免砸砖、屋顶阳台外墙地下室漏水检修与避坑全攻略 - 吉修匠
  • 2026最新镇江市本地黄金铂金白银彩金回收服务 五大黄金靠谱回收门店汇总,正规渠道对比推荐及联系方式 - 前途无量YY
  • 用VBScript和批处理文件模拟恶意网页攻击:一个信息安全新手的实验笔记(附完整代码)
  • 购物卡回收高价技巧,天猫卡轻松变现! - 团团收购物卡回收
  • 从毫米级精度到百米测程:聊聊相位式激光测距里的‘多把尺子’怎么用
  • Gemini为何不开源?解析大模型闭源背后的商业与工程逻辑
  • 保姆级教程:用sendmsg/recvmsg在Linux多进程间传递文件描述符(附完整C代码)
  • Python之ya-direct-api包语法、参数和实际应用案例
  • 2026最新郑州市本地黄金铂金白银彩金回收服务 五大黄金靠谱回收门店汇总,正规渠道对比推荐及联系方式 - 前途无量YY
  • 如何打破游戏语言壁垒:XUnity.AutoTranslator的智能翻译革命
  • 2026宁波优质暖通公司盘点:宁波好享家暖通工程值得推荐 - GrowthUME