如何通过PHP调用Python脚本并创建文件?权限问题求助
我之前在Docker环境里踩过几乎一模一样的权限坑,给你几个实用的排查和解决步骤:
先理清核心原因
你的PHP代码是通过Apache的运行用户(通常是www-data)来执行Python脚本的,而Docker容器内的/tmp目录权限配置、用户权限限制,或者容器挂载规则,导致www-data无法在该目录下创建文件。
先做这几步排查
确认执行脚本的真实用户:在PHP代码里临时加一行,看看实际跑脚本的用户是谁:
echo shell_exec('whoami');正常应该输出
www-data,如果不是,那得先调整Apache/PHP的运行用户配置。检查容器内
/tmp的权限:
先进入你的Docker容器:docker exec -it <你的容器ID/名称> bash然后查看
/tmp的权限详情:ls -ld /tmp正常的
/tmp应该是drwxrwxrwt权限(带sticky位,所有用户都能读写自己创建的文件)。如果显示的是drwxr-xr-x这类权限,那www-data肯定没有写入权限。
针对性解决方案
方案1:修复/tmp目录权限
如果/tmp权限异常,在容器内执行:
chmod 1777 /tmp
1777就是给/tmp设置带sticky位的全读写权限,确保所有用户都能在这创建文件。如果重启容器后权限又变回异常状态,要检查Docker启动命令是不是挂载了只读的tmpfs(比如有没有--tmpfs /tmp:ro参数),改成--tmpfs /tmp:rw或者直接去掉这个挂载配置。
方案2:换一个专属可写目录
如果不想修改/tmp的全局权限,可以在Apache的根目录下创建一个专属临时目录:
# 进入容器后执行 mkdir /var/www/html/temp chown www-data:www-data /var/www/html/temp chmod 755 /var/www/html/temp
然后修改Python脚本里的文件路径:
#!/usr/bin/env python file = open("/var/www/html/temp/testfile.txt","w+") file.write("Hello World") file.close()
方案3:捕获完整错误信息
你当前用的shell_exec只会捕获标准输出,看不到错误日志,建议换成exec同时捕获stderr,方便精准排查:
$command = escapeshellcmd('/usr/local/test/script.py'); exec($command . ' 2>&1', $output, $return_code); echo "执行结果:<br>"; print_r($output); echo "<br>返回码:$return_code";
这样就能看到完整的错误详情,确认是不是权限问题,或者有没有其他隐藏的执行障碍。
额外小检查
虽然不是权限拒绝的直接原因,但还是要确保Python脚本本身能被执行:
chmod +x /usr/local/test/script.py
内容的提问来源于stack exchange,提问作者AshanD

