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