0

当它从命令行运行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
4

3 回答 3

1

centos 7.3 with php via php-fpm php 中的 env 由 php-fpm 清理

您可以使用 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));

或者你可以设置 env 使用一行 shell cmd

var_dump(shell_exec('PATH=/sbin:/bin:/usr/sbin:/usr/bin'.' unoconv -vvvv -f pdf -o 123.pdf 123.doc));

或者您可以更改 /etc/php-fpm.d/www.conf 以将 env 传递给 php,添加此行

clean_env = no

并重新启动 php-fpm

systemctl restart php-fpm.service
于 2017-03-29T03:50:58.630 回答
0

通过直接运行 libreoffice 自己找到了解决方案

sudo libreoffice --headless --convert-to csv --outdir $tmp_path $file
于 2015-12-21T22:57:36.923 回答
0

您使用的 PHP 调用(从聊天中粘贴):

exec("unoconv -f csv $file")

我的猜测是,这exec()给你的环境太有限了。要解决此问题,您可以设置一个轮询目录。PHP 脚本会将要转换的文件复制到轮询目录中并等待文件转换。

然后创建一个 bash 脚本(以 root 或更安全的用户身份运行)以无限循环运行并检查轮询目录中是否有任何传入文件。请参阅如何将轮询文件保留在目录中,直到它到达 Unix以了解 bash 脚本的外观。

当 bash 脚本看到传入的文件时,它会运行 unoconv。

于 2015-12-21T22:26:18.947 回答