尽管你的$ PATH提到了010,所以我不会这样做。
LibreOffice是一个非常大的程序,有很多你不知道的代码,它会生成和更新$ HOME目录中的文件,而且当然不是你能够运行的更多的东西而不是一次一份。
因此,您不应该让Web服务器启动LibreOffice,而是通过将其运行为比“www-data”或“nobody”更优先的用户来破坏Apache的安全性,您应该制作一个处理程序。
首先,验证您是否可以从终端运行libreoffice ...
命令行。为了确保您没有任何X11依赖项,请在测试命令行之前,在xterm中运行unset DISPLAY
(用于bash)或unsetenv DISPLAY
(用于tcsh)。它打破了吗?首先解决这个问题。它工作吗?太棒了,然后继续处理。
您的处理程序最简单的形式可以是一个永久循环的脚本,检查spool文件夹中的“要处理的文件”,如果找到它们,请使用libreoffice转换它们并将结果文件放在可以放置的位置被你的网络应用找到。
#!/bin/sh
while sleep 10; do
if [ `ls /var/tmp/myspool/ | grep -c '\.xlsx$'` -gt 0 ]; then
ls /var/tmp/myspool/*.xlsx | while read file; do
/usr/local/bin/libreoffice --headless -convert-to ooxml "$file" yadda yadda
if [ $? = 0 ]; then
mv "$file" "/var/tmp/myspool/done/
fi
done
fi
done
如果你不想要的东西“轮询”(检查后台打印目录每10秒)的开销,那么你可以有你的PHP脚本中添加一行到得到您的处理器看了日志。例如:
<?php
// process form, save file to spool dir
syslog(LOG_NOTICE, "Saved: " . $filename);
?>
请确保您已配置的Syslog这些消息存储在,比方说,/var/log/filelog
,那么你的处理程序可以只是尾部的日志。
#!/bin/sh
tail -F /var/log/filelog | while read line; do
filename="`echo \"$line\" | sed 's/.*Saved: //'`"
/usr/local/bin/libreoffice --headless -convert-to ooxml "$file" yadda yadda
# etc ... error handling and mv as in the other script
done
想一想吗?
尝试在您的命令中指定'libreoffice'的完整路径,例如'/ usr/local/bin/libreoffice'或者安装它的地方,看看它是否让你更进一步。 – drew010 2012-03-06 23:51:34
处于蠢事的风险 - exec()不会返回错误消息,你确定它默默地失败吗?你试过passthru()吗? – Michal 2012-03-07 00:32:51