【问题标题】:Running LibreOffice soffice.exe on Windows from PHP exec() stuck从 PHP exec() 在 Windows 上运行 LibreOffice soffice.exe 卡住了
【发布时间】:2018-10-19 09:59:37
【问题描述】:

我在使用 LibreOffice 5.4.6 中的 soffice.exe 将 Word 文档转换为 PDF 时遇到问题 - 通过 IIS 在 Windows Server 2012 R2 上运行。

在PHP(chdir)中将目录更改为相关的LibreOffice程序目录后,我在PHP中调用的命令是:

$cmd = "soffice.exe --headless -convert-to pdf -outdir ".sys_get_temp_dir()." ".$workingdoc;
exec($cmd);

其中 $workingdoc 是 .docx Word 文件的完整路径。

sys_get_temp_dir() 在我的系统上转换为 C:\Windows\Temp

如果我将 $cmd 变量回显到浏览器,然后将该输出复制粘贴到服务器上交互的 cmd.exe 命令提示符中,则生成 PDF 时不会出现问题。

例如,我复制粘贴到 cmd.exe 提示符中的回显 $cmd 可能是:

soffice.exe --headless -convert-to pdf -outdir C:\Windows\TEMP C:\Windows\Temp\pdD125.docx

但是,通过 exec() 从 PHP 运行这个 $cmd 变量,与我以交互方式启动 cmd.exe 的用户上下文相同,只是挂起。我可以在任务管理器中看到 soffice.exe,RAM 使用量在 10-20MB 之间徘徊。此外,在我的 C:\Windows\Temp 文件夹中,我每秒连续创建多个空文件夹,同时 soffice.exe 仍在运行,所有文件夹的名称格式为 lu*.tmp

例如,生成的众多文件夹之一是 lu1124fq1pud.tmp

PDF 没有被创建,并且允许 PHP 脚本完成并停止正在创建的 lu 文件夹的唯一方法是强制结束 soffice.exe 任务任务管理器。

那么,为什么 soffice.exe 命令在从 cmd.exe 调用时有效,而不是通过 PHP,即使通过这两种方法在相同的用户上下文中启动它们?

【问题讨论】:

  • 你找到解决这个问题的方法了吗?我遇到了和你描述的完全一样的问题

标签: php windows iis libreoffice


【解决方案1】:

事实证明这是reported here 的已知问题。简而言之,这似乎是用户权限问题。

我解决了我的问题,首先在系统的临时目录中创建了一个临时 LibreOffice 用户配置文件文件夹(不要创建目录,让 soffice.exe 对其进行初始化):

$tempLibreOfficeProfile = sys_get_temp_dir()."\\LibreOfficeProfile".rand(100000, 999999);

然后在soffice.exe命令中添加一个env参数:

$cmd = 'soffice "-env:UserInstallation=file:///'.str_replace("\\", "/", $tempLibreOfficeProfile).'" --headless --convert-to pdf -outdir "'.sys_get_temp_dir().'" '.$workingDoc;
exec($cmd);

确保在完成后清理您的临时个人资料文件夹,以免堵塞您的临时文件夹,例如:

exec('rmdir /S /Q "'.$tempLibreOfficeProfile.'"');

【讨论】:

    猜你喜欢
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 2023-03-03
    相关资源
    最近更新 更多