PHP如何执行命令

我正在尝试使用LibreOffice将电子表格转换为另一种格式,当我从控制台执行命令时它运行正常但是当我使用exec()或system()从PHP执行它时它不起作用.
它没有显示任何错误或任何东西,它只是默默地失败,如果我尝试执行一些简单的命令,如“ls”它工作得很好.

这是我正在使用的命令:

<?php
system("libreoffice --headless -convert-to ooxml '/home/www/path_to_app/file.xlsx' -outdir /home/www/path_to_app/");

我已经尝试将/opt/lampp/etc/httpd.conf上的apache User和Group更改为我所登录的用户.

我想知道问题是www文件夹是/ home而不是我的用户内部并导致权限问题,但到目前为止无法使其工作.

任何帮助将不胜感激.

最佳答案
虽然你的$PATH,提到了010提到,但我不会这样做.

LibreOffice是一个非常大的程序,有很多你不知道的代码,它会在你的$HOME目录中生成和更新文件,当然你也不能运行多个副本一次.

因此,不要让您的Web服务器启动LibreOffice,并通过将其作为比“www-data”或“nobody”更具特权的用户运行来破坏Apache的安全性,您应该创建一个处理程序.

首先,验证您是否可以从终端运行libreoffice …命令行.为了确保您没有任何X11依赖项,请在测试命令行之前在xterm中运行未设置的DISPLAY(对于bash)或unsetenv DISPLAY(对于tcsh).它破了吗?首先解决这个问题.它有用吗?很好,然后继续处理程序.

您的处理程序,最简单的形式,可以是一个永远循环的脚本,检查假脱机目录中的“要处理的文件”,如果找到它们,使用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

明白了吗?

转载注明原文:PHP如何执行命令 - 代码日志