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
相关产品推荐
相关产品推荐

