如何通过按钮执行PHP脚本(Shell命令或AJAX方式)
解决方案:通过前端按钮触发PHP CLI脚本执行
核心问题说明
浏览器端的JavaScript无法直接调用child_process模块(这是Node.js服务端专属API),所以你之前的尝试必然失败。正确的流程是:前端按钮触发AJAX请求到后端接口,由后端服务执行CLI脚本。
实现步骤
1. 前端AJAX触发(jQuery)
给页面上的"envoyer mail test"按钮绑定点击事件,收集用户输入的主题和收件人,发送POST请求到后端接口:
// 假设页面有对应输入框:主题输入框ID为emailSubject,收件人输入框ID为emailTarget $('#sendTestMailBtn').click(function(e) { e.preventDefault(); // 获取用户输入,设置默认值 const subject = $('#emailSubject').val() || "Alerte mail hebdomadaire TEST"; const target = $('#emailTarget').val() || "Aphfug"; $.ajax({ url: '/api/trigger-weekly-alert', // 替换为你的后端接口地址 method: 'POST', data: { subject, target }, success: () => alert('测试邮件已触发发送'), error: (xhr) => alert(`发送失败:${xhr.responseText}`) }); });
2. 后端接口实现(二选一)
因为暂时无法修改cli.php,需要通过后端中间层调用CLI命令,以下两种方案可选:
方案A:Node.js后端(Express)
用Express搭建简单接口,通过child_process执行CLI命令:
const express = require('express'); const { execSync } = require('child_process'); const app = express(); // 解析POST请求参数 app.use(express.urlencoded({ extended: true })); app.use(express.json()); app.post('/api/trigger-weekly-alert', (req, res) => { const { subject, target } = req.body; try { // 转义用户输入,防止命令注入 const safeSubject = subject.replace(/"/g, '\\"'); const safeTarget = target.replace(/"/g, '\\"'); // 拼接完整CLI命令 const command = `php7.4 cli.php -g parentheses -api https://www.archi-wiki.org/api.php -t "${safeSubject}" -u "aw2mw bot" -p '****************' -ns 4000,4006 -nsg 4000 --intro "MediaWiki:Alerte mail hebdomadaire" --target "${safeTarget}" -d`; // 执行命令 execSync(command); res.status(200).send('命令执行成功'); } catch (err) { res.status(500).send(`执行失败:${err.message}`); } }); app.listen(3000, () => console.log('服务运行在3000端口'));
注意:需要先安装Express(
npm install express),确保Node.js进程有cli.php的读取权限和PHP执行权限。
方案B:PHP后端接口
如果服务器支持PHP,直接写一个接口文件调用CLI命令:
<?php if ($_SERVER['REQUEST_METHOD'] !== 'POST') { http_response_code(405); echo json_encode(['status' => 'error', 'msg' => '仅支持POST请求']); exit; } // 获取参数并设置默认值 $subject = $_POST['subject'] ?? "Alerte mail hebdomadaire TEST"; $target = $_POST['target'] ?? "Aphfug"; // 转义参数,彻底避免命令注入 $safeSubject = escapeshellarg($subject); $safeTarget = escapeshellarg($target); // 拼接命令 $command = "php7.4 cli.php -g parentheses -api https://www.archi-wiki.org/api.php -t $safeSubject -u \"aw2mw bot\" -p '****************' -ns 4000,4006 -nsg 4000 --intro \"MediaWiki:Alerte mail hebdomadaire\" --target $safeTarget -d"; // 执行命令并获取结果 exec($command, $output, $returnCode); if ($returnCode === 0) { echo json_encode(['status' => 'success', 'output' => $output]); } else { http_response_code(500); echo json_encode(['status' => 'error', 'msg' => '命令执行失败', 'output' => $output]); } ?>
将该文件命名为
trigger-alert.php,前端AJAX的url指向该文件路径即可。
关键注意事项
- 权限控制:后端进程(Node.js/PHP-FPM)必须拥有
cli.php的读取权限、PHP执行权限,以及访问外部API的网络权限。 - 命令注入防护:必须对用户输入的
subject和target进行转义处理,避免恶意输入执行危险命令。 - 后续优化:等获得
cli.php修改权限后,可以直接将其改造为支持HTTP请求的脚本,去掉CLI依赖,直接处理POST参数,简化流程。
内容的提问来源于stack exchange,提问作者aphfug
相关产品推荐
相关产品推荐

