4

当我在终端中使用 wkhtmltoimage 时,它​​运行良好。但是在php中使用时会出现一些问题。问题是:php代码:

<?php
  $command = './wkhtmltoimage --width 164 --height 105 --quality 100 --zoom 0.2 http://www.google.com file/test.jpg';
  ob_start();
  passthru($command);
  $content = ob_get_clean();
  echo $command;
  echo $content;
?>

它有效。当我在终端中尝试相同的命令时,它也运行良好。

但是当我尝试其他链接时,它无法正常工作。

<?php
  $command = './wkhtmltoimage --width 164 --height 105 --quality 100 --zoom 0.2 http://codante.org/linux-php-screenshot file/test.jpg';
  ob_start();
  passthru($command);
  $content = ob_get_clean();
  echo $command;
  echo $content;
?>

它确实有效。但是当我在终端中尝试相同的命令时。它有效!请帮助我。

4

2 回答 2

4

我猜出于安全原因,在用于 Web 服务器passthru的文件中禁用了它。php.ini尝试执行以下代码:

function passthru_enabled() {
    $disabled = explode(', ', ini_get('disable_functions'));
    return !in_array('exec', $disabled);
}
if (passthru_enabled()) {
    echo "passthru is enabled";
} else {
    echo "passthru is disabled";
}

如果它被禁用,除非您可以编辑 php.ini 文件,否则您真的无能为力。

编辑:另外,请确保您在代码中启用错误报告,如果您尝试使用禁用的功能,它也应该显示某种警告。把它放在你的代码中:

error_reporting(-1);
ini_set('display_errors', 'On');

编辑:

如果passthru启用,那么我能想到命令应该由命令行而不是 PHP 正确执行的唯一原因是因为它没有正确传递到命令行。尝试使用escapeshellarg在参数周围添加引号。

$url = escapeshellarg('http://codante.org/linux-php-screenshot');
$command = "./wkhtmltoimage --width 164 --height 105 --quality 100 --zoom 0.2 $url file/test.jpg";

您可能还想利用 的第二个参数passthru,它返回命令的退出状态。非零值表示存在错误。

passthru($command, $status);
if ($status != 0) {
    echo "There was an error executing the command. Died with exit code: $status";
}

有关这些退出代码的列表以帮助您调试正在发生的事情,请参阅具有特殊含义的退出代码

于 2013-01-31T03:08:42.973 回答
3

我将 PHP exec 关键字与批处理文件一起使用。
它与 wkhtmltoimage 完美配合:
这里是:我创建了 1.html 和 1.bat 和 1.php 并将所有 3 个文件保存到 htdocs 中。

1.蝙蝠:

cd\
cd c:\program files\wkhtmltopdf\bin
wkhtmltoimage http://localhost/1.html C:\howzit.jpg
rem (you can write to C: but not write to htdocs folder.)

1.php:

<?php
    exec("1.bat");
    echo "done c:\howzit.jpg";
?>

PS由于本地主机内的安全设置,这些将不起作用:

<img src = "c:\howzit.jpg">
<img src = "file:///c:/howzit.jpg">
But you will find the new jpg file in your C: directory (WinXP)
于 2014-04-01T21:47:11.873 回答