php exe c () - команда soffice работает в терминале, но не в php exe c () - PullRequest
0 голосов
/ 28 марта 2020
<?php // BISMILLAHIRRAHMANIRRAHEEM
error_reporting(E_ALL);
ini_set("display_errors", 1);

// tried the following with soffice, soffice.com, soffice.exe, soffice.bin
// MS-DOS: soffice, soffice.com, soffice.bin all work successufully and generate the pdf
$ex = "soffice.com --headless --convert-to html \"" . getcwd() . DIRECTORY_SEPARATOR . "sources" . DIRECTORY_SEPARATOR . "test.docx\" --outdir \"" . getcwd() . DIRECTORY_SEPARATOR . "results\"";// 2>&1";

chdir("C:\Program Files\LibreOffice\program");

echo $ex . "<br />";
exec($ex, $output);
//exec("mkdir rr", $output); // generates directory
//exec("dir soff*", $output);
//exec("a.bat", $output); // doesn't generate pdf
print_r($output);
?>

Привет, я использую IIS с Windows 7, PHP 5.6.39. Я не могу преобразовать документ docx в pdf, вызвав LibreOffice через PHP. Команда, выводимая на экран в примере кода, работает, если она выполняется в окне MS-DOS, но не работает в exe c *) или shell_exe c (). Папка, похоже, имеет соответствующие разрешения, так как мои сценарии загрузки и exe c ("mkdir newdir") работают. exec("dir"); также выводит списки каталогов для упомянутого пути, поэтому команды навигации DOS, похоже, тоже работают.

Я бы хотел избежать решения , чтобы сделать другого пользователя. Не элегантно Это не должно быть трудным INSHAALLAH.

Не работая, я имею в виду, что ни один документ не генерируется, и exec() также не генерирует никакого вывода / ошибки, что затрудняет отладку.

Спасибо Вы за свое время.

  • Обновление: после некоторой путаницы я понял, что код возврата: -1073741515 Результаты Google показывают, что это, очевидно, ошибка ввода-вывода файла. Другой скрипт, который я скачал, который делает что-то похожее, также выдал ту же ошибку. Так что изучая причины. Как я уже говорил ранее, каталоги можно создавать и загружать файлы, поскольку у них есть разрешения.

В ссылке, которую я разместил, похоже, необходимо создать нового пользователя. Возможно ли, что IIS имеет разрешения на каталог, но не PHP exec()?

  • На Linux, это дает мне код ошибки 77, разрешение отклонено?

1 Ответ

0 голосов
/ 21 апреля 2020

BISMILLAHIRRAHMANIRRAHEEM

ALHAMDOLILLAH после долгих поисков, наконец, нашел ответ.

Windows:

Я сделал некоторые разрешения et c ранее, должно быть тривиально с IIS. Но в конечном итоге проблема была решена как this .

Очевидно, что необходимо указать -env:UserInstallation=file:///C:\some\path, поскольку вы не можете запускать несколько экземпляров LibreOffice одновременно без указания другой папки профиля ( Ссылка ).

Также см. То же решение здесь .

При выполнении программы через PHP через IIS учетная запись пользователя для Windows учетная запись IUSR.

Итак,

  1. Дайте разрешения IUSR на запись (и измените? Я даю полное) разрешения на запись в каталог C:\inetpub\wwwroot\path.
  2. Измените каталог на путь LibreOffice для soffice.com (не требуется, если при выполнении указывается полный путь):
chdir("C:\\Program Files\\LibreOffice\\program");
Установить переменную среды HOME, так как LibreOffice нужен доступный для записи временный путь. IUSR должен иметь разрешения на этот путь. Я просто повторно использую wwwroot (этот шаг может быть необязательным):
putenv("HOME=C:\\inetpub\\wwwroot\\temp");
Выполнить в PHP, что-то вроде:
exec("\"C:\\Program Files\\LibreOffice\\program\\soffice.com\" --headless \"-env:UserInstallation=file:///C:/inetpub/wwwroot/LibreOfficeProfilePath1\" --convert-to pdf:writer_pdf_Export --outdir \"C:\\inetpub\\wwwroot\\result\" \"C:\\inetpub\\wwwroot\\source\\file.docx\"", $output, $ret);
// Displaying the command output
print_r($output);
echo "<br />\n\n<br />"; // Line breaks for view-source
echo "Return code: " . $ret;
Очистите, удалив каталоги профилей для LibreOffice. Поскольку вы будете создавать уникальные каталоги на лету в серверной среде для одновременных сеансов LibreOffice, вы также хотели бы их удалить. Следующий фрагмент из здесь :
exec("rmdir /S /Q \"C:\\inetpub\\wwwroot\\LibreOfficeProfilePath1\"");

Вы можете создать этот путь к профилю автоматически, например:

// Do this before executing soffice command and pass it to -env
$profilepath = "C:/inetpub/wwwroot/LibreOfficeProfilePath" . date("YmdHis") . rand(0, 999999);
// Make sure to replace '/' with '\' when deleting
exec("rmdir /S /Q \"" . str_replace("/", "\\", $profilepath) . "\""); // Windows
exec("rm -rf \"" . str_replace("/", "\\", $profilepath) . "\"); // Linux

или вместо него использовать PHP удалить каталог с файлами в нем, как показано здесь .

LibreOffice, работающий в качестве службы, и PHP запрос конвертации документов может быть лучшим решением, но этот пост относится к вызову LibreOffice каждый раз, когда необходимо преобразование документа и затем его закрытие. Можно также использовать отдельный метод процесса, чтобы избежать ожидания завершения преобразования LibreOffice.

Linux:

  • Аналогичные шаги для www-data, так как это учетная запись пользователя для apache в Linux. См. Решение здесь .
  • www-data не имеет каталога $ HOME, поэтому его необходимо указать, как указано в (3) выше.
  • env путь будет выглядеть примерно так:
\"-env:UserInstallation=file:///var/www/tmp\"

Обратите внимание на три / после file: независимо от Windows или Linux, даже если пути в Linux начинаются с /, или, может быть, они игнорируют sla sh в Windows, мне кажется несовместимым.

INSHAALLAH это сработает после этого.

...