我在php中编写了以下函数
public static function convert($originFilePath, $outputDirPath, $toFormat)
{
$command = 'echo $PATH & UNO_PATH=/usr/lib/libreoffice unoconv --format %s --output %s %s';
$command = sprintf($command, $toFormat, $outputDirPath, $originFilePath);
exec($command, $output, $result_var);
return compact('output', 'result_var', 'outputDirPath', 'originFilePath', 'toFormat');
}
它没有生成任何错误消息,也没有生成任何pdf文件。
在终端中,当我直接将unoconv作为www-data运行时,我没有任何问题。
执行后这是我的结果:
2013-05-26 03:05:30 Error: Array
(
[output] => Array
(
[0] => /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
)
[result_var] => 1
[outputDirPath] => /var/virtual/storyzer.com/cake-json/ltequotationapp/webroot/outputfiles/Excel/2
[originFilePath] => /var/virtual/storyzer.com/cake-json/ltequotationapp/webroot/outputfiles/Excel/2/dsadas.xlsx
[toFormat] => pdf
)
请告知。
答案 0 :(得分:5)
问题在于我使用的是Nginx和PHP-FPM。
在Nginx中,默认情况下不会声明PATH。
所以有两个解决方案。
1)你在Nginx的fastcgi params中声明它。
请参阅here。
2)您在运行putenv()
代码之前使用unoconv
在脚本中声明它。
像
putenv('PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/opt/node/bin');
我还想补充一点,某种故障排除方法帮助我实现了这个问题。请参阅here。
答案 1 :(得分:2)
有关可能的解决方案,请参阅here。
摘自帖子......
这就是我通过在Cent OS 6.2(unoconv版本0.6和LibreOffice 3.4.5.2)上运行的apache / php代码进行unoconv工作的方法: (这只是一种解决方法 - 根本原因我不知道)
将apache用户从/ sbin / nologin更改为/ bin / bash(这是在/ etc / passwd文件中完成的) 添加新用户unoconv 添加了一个新文件/etc/sudoers.d/unoconv,其中包含以下内容:
apache ALL =(unoconv)NOPASSWD:/ usr / bin / unoconv (注意我的unoconv程序在这个位置/ usr / bin / unoconv - 你发现它使用哪个unoconv)
使用visudo注释掉下面的行(通过在行的开头添加#)
#Defaults requiretty
重启sshd和httpd服务
使用php exec()函数运行这样的unoconv(你需要更改输入文件名和输出目录):
exec('sudo -u unoconv / usr / bin / unoconv -f pdf -o bankgenerated Teacher_bulk_upload.csv');
希望这对你有用