You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过按钮执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 13:07:23