在 Debian 服务器上用 php 运行 unoconv 的最佳方法是什么?

在 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.bin、、进程unoconvoosplash这些进程浪费了内存并最终导致服务器崩溃。

我是否遗漏了什么?

有没有更好的调用方式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

相关内容