【问题标题】:Running exec() from PHP not working从 PHP 运行 exec() 不起作用
【发布时间】:2013-01-31 01:32:11
【问题描述】:

这适用于我的 PHP 代码

$output = array();
exec("ls /Applications/XAMPP/htdocs/MY_APP/images", $output);
var_dump($output);

现在我需要使用 ImageMagick 的“转换”命令将 PNG 文件转换为 PDF 文件。但以下不做任何事情并且不返回任何错误。

$output = array()
exec("convert /Applications/XAMPP/htdocs/MY_APP/images/test.png /Applications/XAMPP/htdocs/MY_APP/images/test.pdf", $output);
var_dump($output);

是权限问题吗?我把 chmod 777 给了 images 文件夹。我还应该检查什么?当我从终端运行命令时,它工作正常。

【问题讨论】:

  • 您的 Apache 用户是否有权运行转换?
  • 这是什么版本的PHP版本?这听起来很像 safe_mode 的老问题。
  • 当您从命令行以 root 身份运行您的程序时,它是否工作?作为另一个用户呢?
  • 是否需要授予特定权限才能运行特定命令?
  • 我的 PHP 版本是 5.3.15 - 其中安全模式已被弃用 - 对吧?

标签: php imagemagick


【解决方案1】:

尝试将 convert 更改为要转换的完整路径,例如usr/local/bin/转换

这可以通过以下方式找到:

<?php
echo "<pre>";
system("type convert"); 
echo "</pre>";
?>

<?php
echo "<pre>";
system('which convert',$path); print_r($path); 
echo "</pre>";
?> 

我刚刚重读了你的帖子,发现你在 XAMPP 上,所以上面的答案可能不起作用。

尝试将所有内容放在同一个文件夹中,以消除路径等方面的任何问题。

exec("convert test.png test.pdf");

你也安装了ghostscript吗?为了证明它有效而不是 ghostscript 问题,请尝试另存为 jpg 而不是 pdf。

【讨论】:

    【解决方案2】:

    如果您的 PHP 代码是通过您的 Web 服务器(例如 Apache)执行的,那么 Apache 进程 (httpd) 可能在受限的 unix 用户(例如 apache 或 httpd)下运行。受限制的 unix 用户通常在您尝试生成 pdf 的 /Applications/XAMPP/htdocs/MY_APP/images/ 目录中没有写入权限。试试这个命令,看看它是否有效:

    exec("convert /Applications/XAMPP/htdocs/MY_APP/images/test.png /tmp/test.pdf", $output);
    var_dump($output);
    

    上述命令尝试在/tmp 目录中生成 pdf,该目录通常对 Apache unix 用户是可写的。

    我注意到您已将 777 分配给 images 文件夹。请理解仅对图像文件夹 chmod 777 是不够的。您还需要向所有父目录中的 Apache 用户授予写权限,例如MY_APP、htdocs、XAMPP、应用程序等是一个重大安全风险,我必须补充。

    【讨论】:

    • 他说他在文件夹上设置了 chmod 777,允许为自己、团队和其他人写作。
    • @user1073122 chmod 777 在 images 文件夹中是不够的。 OP 还需要向所有父目录中的 Apache 用户授予写入权限。
    • 我尝试了“/tmp/test.pdf”,但没有成功。我只是将输出打印为“array(0){}”
    • 我了解安全风险。所以我不介意让它进入 tmp 文件夹。但这似乎也不起作用。
    • 好的,您可以尝试将ini_set('safe_mode', 'Off'); 放在脚本的开头。
    【解决方案3】:

    我遇到了同样的问题:安全模式已关闭,但我仍然无法执行 Image Magick 的转换。

    我发现,由于某种原因,php 看不到脚本(甚至通过 php.ini 包括 include_path 中的路径)。查看日志,发现错误是:

    sh: convert: command not found
    

    尝试使用完整路径调用脚本(我使用which convert检查它)我终于设法通过exec使其正常运行。

    因此,假设转换完整路径为/usr/local/bin,请尝试运行以下命令:

    <?php    
        $output = array();
        exec("/usr/local/bin/convert /Applications/XAMPP/htdocs/MY_APP/images/test.png /Applications/XAMPP/htdocs/MY_APP/images/test.pdf", $output);
        var_dump($output);
    ?>
    

    【讨论】:

      【解决方案4】:

      如果您在 Windows 下遇到此问题,请尝试 exec('identify pathtoyourfile')。如果这有效但 exec('convert ...') 无效,您可能无意中调用了 Window 的转换实用程序而不是 IM 的转换。解决方案是将 IM 的 convert 重命名为 cconvert。或者,检查 IM 是否位于 PATH 环境变量的开头。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-07
        • 1970-01-01
        • 2022-11-02
        • 2015-10-20
        • 2012-02-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多