我有一个 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
我推荐以下内容:
使用最新版本的 unoconv(至少发布时 v0.7,或者今天来自 GitHub 的 master 分支)
使用 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
根据手册
man unoconv
可以在侦听器模式和客户端模式下运行。在客户端模式下,它会寻找一个正在运行的实例,如果找不到则创建一个。您可以尝试在侦听器模式下运行一个实例并更改您的命令以连接到该实例。至少,您将通过避免每次都运行新实例来节省一些资源。
这是取自手册的示例(运行侦听器并进行一些转换):