【问题标题】:PHP Exec Not running, but command works ok!PHP Exec 未运行,但命令运行正常!
【发布时间】:2010-09-06 14:35:16
【问题描述】:

我有以下脚本在 PHP 中获取上传的 PDF 并调用 ImageMagik/Ghostscript 以转换为指定大小的图像。

$tmp = exec("convert \"{$strPDF}\" -resize 500X500 \"{$strOut}\"", $results); 

但是,这似乎不起作用。日志文件中没有错误,屏幕上也没有错误。如果我执行以下操作,

$tmp = exec("convert \"{$strPDF}\" -resize 500X500 \"{$strOut}\"", $results); 
echo ("convert \"{$strPDF}\" -resize 500X500 \"{$strOut}\"");

我将输出粘贴到命令提示符中,它工作正常(大约需要 6-10 秒 - 我的 max_execution_time 为 600。

关于为什么这可能不起作用的任何建议?

这是 Windows、IIS 7 和 PHP5。

编辑:我在 CentOS 和 Windows 中都遇到了同样的问题。两者都安装了 ImageMagik 和 Ghostscript。

编辑下面的编辑仍然失败。

$handle = popen("convert \"{$strPDF}\" -resize 500X500 \"{$strOut}\"","r");
        echo "'$handle'; " . gettype($handle) . "\n";
        $read = fread($handle, 2096);
        echo $read;
        pclose($handle);

【问题讨论】:

  • 你把变量直接放在命令行是自找麻烦。 CLI 注入SQL 注入 一样危险,甚至更危险。使用escapeshellarg()
  • @Andrew 评论指出,谢谢。
  • 尝试使用 popen 代替 exec 并读取输出(使用 fgets)
  • @Milan Babuškov 同样的问题。 :( 用代码更新了主帖。
  • $strPDF 或 $strOut 是否包含空格?

标签: php


【解决方案1】:

尝试在命令末尾添加 2>&1。我找到了here

exec('some_command 2>&1', $output);
print_r($output);  // to see the respond to your command

【讨论】:

    【解决方案2】:

    在php.ini中可能这个函数exec声明下

    disable_functions
    

    或者如果你在

    安全模式

    当 PHP 在safe mode 中运行时,此功能被禁用。

    【讨论】:

    • (safe_mode = Off and disable_functions = ) 所以看起来不像。
    • 可能是这个文件或这个目录的权限
    【解决方案3】:

    这可能是您的 PATH 变量有问题吗?

    您可能想尝试运行

    <?php
    echo exec('cmd.exe /c echo %path%');
    ?>
    

    在命令行和 IIS 中并比较它们的输出。

    【讨论】:

    • 在这种情况下尝试使用绝对路径可能会有所帮助(特别是如果连“cmd.exe”都没有执行)。
    猜你喜欢
    • 2016-11-30
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    相关资源
    最近更新 更多