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

Kim*_*cks 6 php pdf shell 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');
}
Run Code Online (Sandbox Code Playgroud)

它没有生成任何错误消息,也没有生成任何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
)
Run Code Online (Sandbox Code Playgroud)

请指教.

Kim*_*cks 5

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

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

所以有2个解决方案.

1)你在Nginx的fastcgi params中声明它.

看到这里.

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

我还想补充一点,某种故障排除方法帮助我实现了这个问题.看到这里.


Ora*_*ill 2

有关可能的解决方案,请参阅此处

摘自帖子...

这就是我通过在 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 注释掉以下行(通过在行开头添加 # )

#默认要求

重新启动 sshd 和 httpd 服务

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

exec('sudo -u unoconv /usr/bin/unoconv -f pdf -o 银行生成的 Teacher_bulk_upload.csv');

希望这对你有用