Скрипт 'unoconv' работает в терминале, но не при вызове через функцию exec () в моем контроллере laravel - PullRequest
2 голосов
/ 06 июня 2019

Я пытаюсь использовать следующий сценарий оболочки для преобразования файла docx в pdf:

unoconv -f pdf tempfile.docx

В Laravel у меня есть функция контроллера, которая создает файл temp docx с помощью phpWord, который янеобходимо преобразовать в PDF и вернуть URL-адрес.

Я установил unoconv, используя apt-get на моем ubuntu 16.04 сервере, и когда я запускаю ssh на сервер и запускаю unoconv через мой терминал, он работает на 100% правильно, однако, когда я запускаю его с помощью exec () в моем контроллере ничего не происходит!Я думаю, что это может быть путь к docx по какой-то причине неверен, но я не уверен почему, так как я использую точный метод для получения пути к файлу, который будет правильно возвращать местоположение .docx

        $path_copy = 'store/' . $email . '_higher_results.docx';
        $path_copy_pdf = 'store/' . $email . '_higher_results.pdf';
        $filename = public_path($path_copy);

        $the_download->saveAs($filename); //saves my .docx created by phpWord

        exec('unoconv -f pdf ' . $path_copy); //should take the .docx created above and convert it into a pdf

        //return $path_copy; //this returns the correct path of the .docx, and adds it to a link in my .vue component which allows the user to download the .docx
        return $path_copy_pdf; //this SHOULD return the correct path of the PDF but the PDF is never created at the exec() step

Файл docx (и возможный pdf) существует в моей общей папке laravel по пути: /public/store/tempfile.docx

Я также пробовал использовать переменную $ filename выше, которая вызывает путь, используяpublic_path (), а также без кубиков.

Есть ли какая-то проблема с синтаксисом, связанная с тем, как я получаю путь к моему файлу .docx в моей функции exec ()?Есть ли какая-то другая проблема?

Спасибо!

Редактировать: теперь я использую Symfony для запуска моего скрипта оболочки, но та же проблема, просматривая обновление версий и выясняя, есть ли какие-то конкретные пути пакетов, которые мне нужныизменить в исполняемом файле unoconv.Потенциально также может быть какая-то проблема с разрешениями, потому что пользователь root может выполнить команду, а пользователь www-data - нет!(

1 Ответ

0 голосов
/ 08 июня 2019

Отвечая на мой вопрос, потому что мне потребовалось три года, чтобы понять:

Проблема заключалась в том, что в командной строке, когда я ssh-ed на свой сервер, я запускаю "root", а сервер выполняет команды exec () / Symfony как www-data

Решением было установить домашний каталог www-data перед запуском команды

 $process = new Process("HOME=".getCWD()." && export HOME && libreoffice --headless --convert-to pdf store/mar_maribov_higher_results.docx --outdir store");
        $process->run();
        return $path_copy_pdf;

Кредит: https://stackoverflow.com/a/37666818/3812918

...