Libreoffice headless Process 结果不返回,而是等待超时
Libreoffice headless Process result is not returned, but waits for timeout
我们现在使用 libreoffice --headless
有一段时间了,首先是通过 Debian,在过去的几个月里我们切换到 CentOS。我们正在使用 Symfony Process 命令将 docx
转换为 pdf
,简化的命令如下所示:
libreoffice --headless --convert-to pdf \
--outdir /home/conversionoutdir \
/home/conversionindir/4f00ac05aee274967b.docx
执行上述命令的 Symfony 进程非常简单:
$process = new Process($cmd);
$process->mustRun();
一切正常,但几天后转换不再完成,该过程将停止,直到达到 60 秒超时。
通过在我们的 DEV
服务器上进行完全相同的转换来对此进行调试,一切正常。还尝试转换小型和大型文档,以查看或达到超时的页数。也直接在命令行上执行命令,转换也可以,几秒钟内完成。
异常被我们的应用程序捕获,并发送到记录器:
The process \"/usr/bin/libreoffice --headless --nologo --nofirststartwizard --norestore --convert-to pdf:writer_web_pdf_Export --outdir /home/conversionoutdir /home/conversionindir/4f00ac05aee274967b.docx\" exceeded the timeout of 60 seconds.
似乎 PHP 无法再跟踪进程了。这里会发生什么?关于如何进一步调试的任何线索?
编辑: 在抽象出 Symfony 进程组件后,将 conversionoutdir
权限设置为 777 并执行以下代码片段,如果从 PHP:
$output = array();
exec('libreoffice --headless --convert-to pdf \
--outdir /home/conversionoutdir \
/home/conversionindir/4f00ac05aee274967b.docx', $output);
print_r($output);
找到了这个问题的解决方案,不知何故 linux 的 HOME
变量被更改为 /root
而 libreoffice 无法转换到该路径。也许这在重新启动 Apache 时以某种方式改变了。
解决方案是始终让 PHP 将 /tmp
设置为 HOME
变量:
putenv('HOME=/tmp');
以下帖子提供了更多信息:
- https://superuser.com/questions/627211/effect-of-home-on-libreoffice-to-convert-to-pdf-as-non-root-user
- https://superuser.com/questions/627266/convert-file-to-pdf-using-libreoffice-under-user-apache-i-e-when-using-php
- Running libreoffice from php exec()
- Libreoffice --headless refuses to convert unless root, won't work from PHP script
我们现在使用 libreoffice --headless
有一段时间了,首先是通过 Debian,在过去的几个月里我们切换到 CentOS。我们正在使用 Symfony Process 命令将 docx
转换为 pdf
,简化的命令如下所示:
libreoffice --headless --convert-to pdf \
--outdir /home/conversionoutdir \
/home/conversionindir/4f00ac05aee274967b.docx
执行上述命令的 Symfony 进程非常简单:
$process = new Process($cmd);
$process->mustRun();
一切正常,但几天后转换不再完成,该过程将停止,直到达到 60 秒超时。
通过在我们的 DEV
服务器上进行完全相同的转换来对此进行调试,一切正常。还尝试转换小型和大型文档,以查看或达到超时的页数。也直接在命令行上执行命令,转换也可以,几秒钟内完成。
异常被我们的应用程序捕获,并发送到记录器:
The process \"/usr/bin/libreoffice --headless --nologo --nofirststartwizard --norestore --convert-to pdf:writer_web_pdf_Export --outdir /home/conversionoutdir /home/conversionindir/4f00ac05aee274967b.docx\" exceeded the timeout of 60 seconds.
似乎 PHP 无法再跟踪进程了。这里会发生什么?关于如何进一步调试的任何线索?
编辑: 在抽象出 Symfony 进程组件后,将 conversionoutdir
权限设置为 777 并执行以下代码片段,如果从 PHP:
$output = array();
exec('libreoffice --headless --convert-to pdf \
--outdir /home/conversionoutdir \
/home/conversionindir/4f00ac05aee274967b.docx', $output);
print_r($output);
找到了这个问题的解决方案,不知何故 linux 的 HOME
变量被更改为 /root
而 libreoffice 无法转换到该路径。也许这在重新启动 Apache 时以某种方式改变了。
解决方案是始终让 PHP 将 /tmp
设置为 HOME
变量:
putenv('HOME=/tmp');
以下帖子提供了更多信息:
- https://superuser.com/questions/627211/effect-of-home-on-libreoffice-to-convert-to-pdf-as-non-root-user
- https://superuser.com/questions/627266/convert-file-to-pdf-using-libreoffice-under-user-apache-i-e-when-using-php
- Running libreoffice from php exec()
- Libreoffice --headless refuses to convert unless root, won't work from PHP script