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コマンドの終了ステータスを返す の2 番目のパラメータを利用することもできます。ゼロ以外の値は、エラーがあったことを示します。

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 に答える