什么是最好的方式在debian服务器上运行php unoconv?

我有一个PHP脚本,我需要将doc文档转换为html文件,以便在网页中显示它们。

我正在使用php命令进行转换:

exec ( $Command, $Output, $ReturnValue ) ; 

哪里

 $Command = "/usr/bin/timeout -s 9 $TimeOut /usr/bin/unoconv -f html -o " . escapeshellarg($Dir) . " " . escapeshellarg($File) ; 

显然,一切运行良好,但有时过程并没有结束,我仍然保留着数百个soffice.binunoconvoosplash进程,浪费内存,并肯定会使服务器崩溃。

我错过了什么?

有没有更好的方法来调用unoconv

我应该将unoconv服务器作为系统服务运行吗?

我使用的是:LibreOffice 3.5,Unoconv 0.5,apache 2.2.22-13 + deb7u4

我build议如下:

  • 使用最新版本的unoconv(至lessv0.7发布时,或者GitHub的master分支)

  • 使用LibreOffice的最新稳定版本(最近的版本使用较less的内存,通常速度更快,崩溃更less)

  • 使用原生的LibreOffice python二进制运行unoconv,例如。 /opt/libreoffice4.4/program/python/usr/bin/unoconv -f pdf file.doc

  • 在unoconv脚本shebang中硬编码Pythonpath,所以放在第一行#!/ opt / libreoffice4.4 / program / python而不是#!/ usr / bin / env python。 (Apache / PHP通常不会设置PATH,所以unoconv失败)

  • 确保运行unoconv的用户有对其HOME目录的写权限

如果你这样做,一切都应该正常工作。 如果LibreOffice仍然崩溃,则应该将其与上游项目一起使用。 另外要注意,LibreOffice不能同时处理多个连接/客户端,所以理想情况下,您的PHP脚本应该正确locking和/或排队请求。 (看看这个群体系统工具)

如果您仍然有任何问题,请将其报告至: http : //github.com/dagwieers/unoconv/issues

根据手册man unoconv可以以监听模式和客户模式运行。 在客户端模式下,它将查找正在运行的实例,并将创build一个,如果找不到一个。

您可以尝试在侦听器模式下运行一个实例,并更改命令以连接到此实例。 至less,您将节省一些资源,避免每次都需要运行新的实例。

下面是从手册中获取的示例(运行监听器并进行一些转换):

 unoconv --listener & unoconv -f pdf some-document.odt unoconv -f doc other-document.odt unoconv -f jpg some-image.png unoconv -f xsl some-spreadsheet.csv