从PHP exec()在Windows上运行LibreOffice soffice.exe时遇到问题

从PHP exec()在Windows上运行LibreOffice soffice.exe时遇到问题,php,windows,iis,libreoffice,Php,Windows,Iis,Libreoffice,我在使用LibreOffice 5.4.6中的soffice.exe(通过IIS在Windows Server 2012 R2上运行)将Word文档转换为PDF时遇到问题 在PHP中将目录更改为相关的LibreOffice程序目录(chdir)后,我在PHP中调用的命令是: $cmd = "soffice.exe --headless -convert-to pdf -outdir ".sys_get_temp_dir()." ".$workingdoc; exec($cmd); 其中$wor

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

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

$cmd = "soffice.exe --headless -convert-to pdf -outdir ".sys_get_temp_dir()." ".$workingdoc;
exec($cmd);
其中$workingdoc是.docx Word文件的完整路径

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

例如,生成的许多文件夹中有一个是lu1124fq1pud.tmp

PDF不会被创建,允许PHP脚本完成并停止正在创建的lu文件夹(除了PHP超时)的唯一方法是在任务管理器中强制结束soffice.exe任务


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

事实证明,这是一个众所周知的问题。简而言之,这似乎是一个用户权限问题

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

然后将环境参数添加到soffice.exe命令:

$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.'"');

你找到解决这个问题的办法了吗?我的问题和你描述的完全一样
exec('rmdir /S /Q "'.$tempLibreOfficeProfile.'"');