unoconv работает с терминала, используя www-данные, но не из php-скрипта, а также как www-данные

Я написал следующую функцию в 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
)

Пожалуйста, порекомендуйте.

3 ответа

Решение

Проблема в том, что я использую Nginx и PHP-FPM.

В Nginx PATH НЕ объявляется по умолчанию.

Итак, есть 2 решения.

1) Вы объявляете это в параметрах fastcgi для Nginx.

Смотрите здесь.

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

Я также хотел бы добавить, что определенный метод устранения неполадок помог мне понять эту проблему. Смотрите здесь.

Возможные решения смотрите здесь.

Выдержка из поста...

Это то, что я сделал, чтобы заставить unoconv работать через код apache / php, работающий в Cent OS 6.2 (unoconv версии 0.6 и LibreOffice 3.4.5.2): (Это только обходной путь - основная причина мне не известна)

Измените пользователя 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

Запустите unoconv следующим образом с функцией php exec() (вам нужно изменить имя входного файла и выходной каталог):

exec ('sudo -u unoconv /usr/bin/unoconv -f pdf -o сгенерированный банк Teacher_bulk_upload.csv');

Надеюсь, это сработает для вас

У меня была та же проблема, и я решил ее, добавив две подпапки в /var/www/.cache и .config, которые необходимы для unoconv.

Сервер Env Ubuntu 18.04 Apache, unoconv 0.7, платформа posix/linux,python 3.6.9 (по умолчанию, 8 декабря 2021 г., 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-данные $HOME

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

Я думаю, что небезопасно изменять разрешения /var/www/ (на пользователя и группу www-data), но можно добавить папку .cache и .config с разрешениями www-data. Пусть некоторые эксперты подтвердят.

PS генератор возвращает ошибку о версии docx, но pdf генерируется

      $command = 'unoconv -f pdf ' . $path.$file;
exec($command, $output);
Другие вопросы по тегам