儘管你的$ 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