unoconv使用www-data从终端工作,但不从php脚本也作为www-data工作

时间:2013-05-25 09:09:08

标签: php shell pdf ubuntu uno

我在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
)

请告知。

2 个答案:

答案 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');

希望这对你有用