当以root
的形式从命令行运行此程序时,它可以使用
unoconv -f csv $file
但当它作为www-data
运行时,这个错误会返回
Traceback (most recent call last):
File "/usr/bin/unoconv", line 1114, in <module>
office_environ(of)
File "/usr/bin/unoconv", line 203, in office_environ
os.environ['PATH'] = realpath(office.basepath, 'program') + os.pathsep + os.environ['PATH']
File "/usr/lib/python3.4/os.py", line 633, in __getitem__
raise KeyError(key) from None
KeyError: 'PATH'
更新
echo shell_exec('echo $PATH');
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
centos 7.3通过php-fpm使用phpphp中的env由php fpm 清理
u可以使用putenv在php代码中设置evn["PATH"],例如
putenv("PATH=/sbin:/bin:/usr/sbin:/usr/bin");
var_dump(shell_exec('unoconv -vvvv -f pdf -o 123.pdf 123.doc));
或者u可以使用单行shell cmd 设置env
var_dump(shell_exec('PATH=/sbin:/bin:/usr/sbin:/usr/bin'.' unoconv -vvvv -f pdf -o 123.pdf 123.doc));
或者u可以更改/etc/php-fpm.d/www.conf将env传递给php,添加此行
clean_env = no
和重新启动php fpm
systemctl restart php-fpm.service
您使用的PHP调用(从聊天中粘贴):
exec("unoconv -f csv $file")
我的猜测是exec()
给你的环境太有限了。要解决此问题,您可以设置一个轮询目录。PHP脚本会将要转换的文件复制到轮询目录中,然后等待文件转换。
然后创建一个bash脚本(以root用户或更安全的用户身份运行)以在无限循环中运行,并检查轮询目录中是否有任何传入文件。有关bash脚本的外观,请参阅如何在文件到达Unix之前一直在目录中轮询文件。
当bash脚本看到传入文件时,它会运行unoconv。
通过直接运行libreoffice 自己找到了一个解决方案
sudo libreoffice --headless --convert-to csv --outdir $tmp_path $file