我有一个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.bin , unoconv , oosplash进程,浪费内存,并肯定会使服务器崩溃。
我错过了什么?
有没有更好的方法来调用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