在/var/www/html目录下PHP调用含TensorFlow的Python代码报错
解决PHP调用依赖TensorFlow的Python脚本时出现的"invalid ELF header"错误
看起来你在/var/www/html目录下用PHP调用依赖TensorFlow的Loader.py时踩了个坑——那个invalid ELF header错误其实挺常见的,我来给你拆解下原因和解决办法:
先搞懂错误根源
这个ImportError本质是说TensorFlow的核心动态链接库_pywrap_tensorflow.so不符合系统的ELF格式要求,通常是这几个原因:
- 你装的TensorFlow版本和系统架构不匹配(比如64位系统装了32位包)
- PHP执行时调用的Python环境和你手动测试的不是同一个,导致环境里的TensorFlow有问题
- TensorFlow安装过程中文件损坏,导致
.so文件不完整
一步步解决问题
1. 先确认系统架构和TensorFlow版本匹配
先在终端跑这个命令看你的系统是32位还是64位:
uname -m
如果输出是x86_64,那你必须用64位的TensorFlow。如果之前装错了版本,先卸载重装:
pip uninstall tensorflow # 注意Python2.7只支持TensorFlow 1.x版本,比如1.15.0是最后一个适配版本 pip install tensorflow==1.15.0
2. 确保PHP用的是正确的Python环境
很多时候PHP运行时的Python解释器和你终端里的不一样,先改下PHP代码看看当前用的是哪个Python:
$python_path = shell_exec('which python 2>&1'); echo "PHP使用的Python路径:" . $python_path; $temp = shell_exec('python Loader.py 2>&1') or die('cannot run Loader.py') ; echo $temp;
然后对比你终端里执行which python的结果,如果路径不一样,说明PHP用的是另一个没装TensorFlow的环境。这时候你需要在PHP里指定完整的Python路径,比如:
# 假设你终端里的正确Python路径是/usr/bin/python2.7 $temp = shell_exec('/usr/bin/python2.7 Loader.py 2>&1') or die('cannot run Loader.py') ; echo $temp;
3. 重装TensorFlow修复损坏文件
如果上面两步都没问题,大概率是安装时文件损坏了,彻底清理后重装:
pip uninstall -y tensorflow # 手动清理残留的TensorFlow目录 rm -rf /usr/local/lib/python2.7/dist-packages/tensorflow/ # 重新安装适配版本 pip install tensorflow==1.15.0
4. 检查文件权限
别忘了Web服务的运行用户(一般是www-data)得有权限读取TensorFlow的文件:
sudo chown -R www-data:www-data /usr/local/lib/python2.7/dist-packages/tensorflow/ sudo chmod -R 755 /usr/local/lib/python2.7/dist-packages/tensorflow/
最后测试下:切换到/var/www/html目录,用PHP对应的Python解释器手动跑python Loader.py,如果手动能正常运行,那PHP调用应该也没问题了。
内容的提问来源于stack exchange,提问作者rockz
相关产品推荐
相关产品推荐

