【问题标题】:shell_exec() in PHP doesn't execute my specific commandPHP 中的 shell_exec() 不执行我的特定命令
【发布时间】:2010-07-28 10:00:06
【问题描述】:

我目前正在 PHP 中构建一个使用WKHTMLTOPDF 命令行应用程序生成 PDF 文档的类。

为此,我使用了对 shell_exec 的调用来调用 WKHTMLTOPDF 可执行文件。但是,这个特定的调用似乎没有被执行;它几乎立即返回 NULL。

我做的一个小测试给了我以下结果:

var_dump(shell_exec('ping nu.nl'));
// This prints a string, containting the expected output of the ping command
var_dump(shell_exec('"c:/wkhtmltopdf/wkhtmltopdf.exe" --orientation "Landscape" --page-size "A2" --margin-top "25mm" --margin-left "20mm" --margin-bottom "20mm" --margin-right "20mm" "http://www.nu.nl/" "C:/Temp/1280310218.pdf"'));
// This prints NULL

所以,shell_exec() 似乎工作正常,safe_mode 也已关闭,将完整命令粘贴到 cmd.exe 确实正确运行命令。

如果问题不在上述任何一个中(安全模式、错误命令或shell_exec() 本身),还有什么可能?我能想到的只是用户权限问题,但可执行文件和它所在的目录对我系统上的每个用户组都有完全访问设置。

(注意:虽然我是在 Windows 机器上开发的,但此代码将在生产环境中的 Linux 服务器上运行。因此,仅 Windows 的解决方案不是我要寻找的,除非这个问题本身出现与windows相关)

【问题讨论】:

  • 您是否尝试过“手动”写信给c:/temp/,以确保 php 进程所有者有权在那里写信?
  • @Dennis Haarbrink:刚刚测试过,效果很好。但即使我不希望在shell_exec() 返回的结果字符串中看到这一点,因为 WKHTMLTOPDF 会在文件不可读取/不可写入时警告我。

标签: php shell-exec


【解决方案1】:

通过在临时目录中使用 fopen() 创建文件来检查权限。 它会创建 pdf 吗?也许这个程序不会输出到 stdout,但 stderr 与 ffmpeg 相同。尝试在命令后添加“2>&1”。

或者,该软件使用了安装目录中的一些文件。首先尝试通过添加“cd c:\wkhtmltopdf;YOUR_COMMAND”之类的内容来更改目录

【讨论】:

  • 你的第一个建议成功了;显然,不允许在要执行的命令 ("c:/wkhtmltopdf/wkhtmltopdf.exe") 周围加上引号,并且该错误确实存储在 stderr 中。并且认为我只添加了这些引号,因为该应用程序首先安装在 Program Files/ 中!
【解决方案2】:

您可以使用 php 库来执行此操作,这样会更高效和集成。比如html2pdf

【讨论】:

  • 我选择 CLI 应用程序而不是 PHP 库的原因是因为我检查过的应用程序都没有提供我们需要的所有选项; FPDF、DOMPDF、TCPDF 等等,都以一种或另一种方式缺乏。 WKHTMLTOPDF 是迄今为止最好和最完整的解决方案。如果它有效,那就是。
【解决方案3】:

移除这些环境变量设置>>

"DYLD_LIBRARY_PATH="/Applications/MAMP/Library/lib:$DYLD_LIBRARY_PATH"

#export DYLD_LIBRARY_PATH

它应该可以工作。

【讨论】:

  • 您能否详细说明您认为这应该起作用的原因以及它如何适合答案,通过删除这些环境变量设置解决了哪些问题?
  • 他在 Win 中开发并将部署在 linux 上,所以这里没有 Mamp
猜你喜欢
  • 2018-05-26
  • 1970-01-01
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 2016-03-01
  • 2021-03-04
相关资源
最近更新 更多