【问题标题】:unoconv works from terminal using www-data but not from php script also as www-dataunoconv 从终端使用 www-data 但不是从 php 脚本也作为 www-data
【发布时间】:2022-01-28 18:02:18
【问题描述】:

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

请指教。

【问题讨论】:

    标签: php shell pdf ubuntu uno


    【解决方案1】:

    问题是我使用的是 Nginx 和 PHP-FPM。

    在 Nginx 中,默认情况下不声明 PATH。

    所以有两种解决方案。

    1) 你在 Nginx 的 fastcgi 参数中声明它。

    here

    2) 您在运行unoconv 代码之前使用putenv() 在脚本中声明它。

    喜欢

    putenv('PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/opt/node/bin');

    我还想补充一点,某种故障排除方法帮助我意识到了这个问题。见here

    【讨论】:

    • 花了我一个多星期,但我终于弄明白了! :) 互联网太棒了!~~
    【解决方案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 - 您可以使用 which unoconv 找到它)

    使用 visudo 注释掉后面的行(通过在行首添加 #)

    #Defaults 要求

    重启sshd和httpd服务

    使用 php exec() 函数像这样运行 unoconv(您需要更改输入文件名和输出目录):

    exec('sudo -u unoconv /usr/bin/unoconv -f pdf -o bankgenerated Teacher_bulk_upload.csv');

    希望这对你有用

    【讨论】:

    • 我之前在谷歌搜索时看到了这个。在尝试此解决方法之前,我正在尝试其他可能的解决方案。我将等待其他可能的解决方案。如果没有什么好的结果,我将采用这种解决方法。谢谢!~
    【解决方案3】:

    我有同样的问题,并通过添加两个子文件夹来解决它 /var/www/ unoconv 需要的 .cache 和 .config

    环境 Ubuntu 18.04 服务器 Apache, unoconv 0.7, 平台 posix/linux, python 3.6.9(默认,2021 年 12 月 8 日,21:08:43), [GCC 8.4.0], LibreOffice 6.0.7.3

        user@ip-*-*-*-*:/var/www$ sudo mkdir .cache
        user@ip-*-*-*-*:/var/www$ sudo chown -R www-data:www-data .cache/
        user@ip-*-*-*-*:/var/www$ sudo chmod -R 744 .cache/
        user@ip-*-*-*-*:/var/www$ sudo mkdir .config
        user@ip-*-*-*-*:/var/www$ sudo chown -R www-data:www-data .config/
        user@ip-*-*-*-*:/var/www$ sudo chmod -R 744 .config/
    

    www-data 的主文件夹是 /var/www/,默认设置为 root 用户,unoconv 无法创建缓存和配置所需的文件夹。

    检查您的 www-data $HOME

    sudo cat /etc/passwd | grep www-data
    www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
    

    我认为更改 /var/www/ 的权限(更改为 www-data 用户和组)是不安全的,但可以添加具有 www-data 权限的 .cache 和 .config 文件夹。让一些专家确认一下。

    附:生成器返回有关 docx 版本的错误,但生成了 pdf

    $command = 'unoconv -f pdf ' . $path.$file;
    exec($command, $output);
    

    【讨论】:

      猜你喜欢
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多