我有一个 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
答案1
我建议如下:
使用最新版本的 unoconv(至少是发布时的 v0.7,或者今天来自 GitHub 的主分支)
使用最新的稳定版本的 LibreOffice(最新版本占用更少的内存,通常速度更快,崩溃更少)
使用原生 LibreOffice python 二进制文件运行 unoconv,例如 /opt/libreoffice4.4/program/python /usr/bin/unoconv -f pdf file.doc
在 unoconv 脚本 shebang 中对 python 路径进行硬编码,因此在第一行输入 #!/opt/libreoffice4.4/program/python 而不是 #!/usr/bin/env python。(Apache/PHP 通常不设置 PATH,因此 unoconv 会失败)
确保运行 unoconv 的用户对其 HOME 目录具有写权限
如果您执行上述操作,一切都会顺利进行。如果 LibreOffice 仍然崩溃,您应该向上游项目提出此问题。还要注意,LibreOffice 无法同时处理多个连接/客户端,因此理想情况下,您的 PHP 脚本应该正确锁定和/或排队请求。(请查看 flock 系统实用程序以了解这一点)
如果您仍有问题,请报告至:http://github.com/dagwieers/unoconv/issues
答案2
根据手册,man unoconv
它可以在侦听器模式和客户端模式下运行。在客户端模式下,它将查找正在运行的实例,如果找不到,则创建一个。
您可以尝试以侦听器模式运行一个实例,然后更改命令以连接到该实例。至少,通过避免每次运行新实例,您可以节省一些资源。
以下是取自手册的一个例子(运行监听器并进行一些转换):
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