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

MySQL 8.0中PHP调用Bash执行MySQL查询无响应问题求助

问题排查与解决建议

环境信息

  • 操作系统:最新Almalinux 9
  • Web服务:Apache/2.4.57
  • 数据库:MySQL 8.0.36
  • 编程语言:PHP 7.4.33

PHP测试文件(phpbash.php)

<?php 
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
shell_exec("sh /d/phpbash.sh") ;
echo "DONE" ;
?>

Bash测试文件

#!/bin/bash

mysql -uroot -e 'SELECT id, programid FROM data.call'  >> /d/testoutput.txt ;

printf 'SELECT id, programid FROM data.call\n'  >> /d/testoutput.txt ;

exit ;
    sh

问题描述

  • 直接在Shell中执行sh /d/phpbash.sh时,MySQL查询命令和printf命令均正常执行,结果写入/d/testoutput.txt;
  • 通过浏览器访问phpbash.php时,仅printf命令生效,MySQL查询无任何执行痕迹(已开启MySQL全日志,未捕获到该查询);
  • 由于printf命令正常运行,说明PHP调用Bash的权限无问题;
  • 相同脚本在CentOS 7 + MySQL 5.5的环境下可正常运行。

解决思路

1. MySQL 8.0 身份验证与权限适配

MySQL 8.0默认使用caching_sha2_password身份验证插件,而CentOS7的MySQL5.5采用mysql_native_password,这是核心差异点:

  • 执行SELECT user,plugin FROM mysql.user WHERE user='root';检查root用户的验证插件,若为caching_sha2_password,可给root添加mysql_native_password登录方式,或创建专门供web进程使用的数据库用户,授予data.call表的查询权限;
  • 确认root用户允许本地(localhost/127.0.0.1)登录,查看mysql.user表中root的host字段是否包含localhost或127.0.0.1。

2. 环境变量与路径问题

直接Shell执行时的环境变量(如PATH、MYSQL_HOME)在Apache进程中可能缺失:

  • 在bash脚本中指定mysql的绝对路径(通过which mysql获取),比如修改为/usr/bin/mysql -uroot -e 'SELECT id, programid FROM data.call',避免因PATH找不到命令;
  • 在php中执行shell_exec("env >> /d/env_output.txt"),对比直接Shell执行的env输出,排查缺失的MySQL相关环境配置。

3. SELinux限制排查

Almalinux 9默认开启SELinux,可能阻止Apache进程访问MySQL资源:

  • 临时关闭SELinux测试:执行setenforce 0,重新访问php文件,若MySQL命令生效则说明是SELinux问题;
  • 永久配置:执行setsebool -P httpd_can_network_connect_db on,允许Apache连接MySQL,或调整mysql socket文件(默认/var/lib/mysql/mysql.sock)的SELinux上下文。

4. 命令权限检查

  • 执行ls -l $(which mysql),确保apache用户对mysql命令有执行权限(其他用户组需有x权限);
  • 检查mysql socket文件的权限,确保apache用户拥有读权限。

内容的提问来源于stack exchange,提问作者Serge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 01:22:24