【问题标题】:Php exec command to convert an imagephp exec命令转换图像
【发布时间】:2013-07-13 08:11:22
【问题描述】:

我正在尝试使用 imagemagick 命令“convert”从 .png 图像创建 .tif 图像。

我带来的是:

$exec = "/opt/local/bin/convert -adaptive-resize 150% ".$pos.".png ".$pos.".tif";
exec($exec);

如果我遇到 CLI “which convert”,我会得到该路径:/opt/local/bin/convert。我也试过没有路径,只有/opt/local/bin/convert -adaptive-resize 150% ".$pos.".png ".$pos.".tif/etc/local/bin/convert -adaptive-resize 150% ".$pos.".png ".$pos.".tif

如果我在终端中运行该命令,它会按预期工作,但是当我尝试从 PHP 脚本中使用它时,它就不起作用了。

编辑: 我也尝试使用以下代码创建一个 .sh 文件,但没有成功:

#! /bin/bash
convert -adaptive-resize 150% 1.png 1.tif
convert -adaptive-resize 150% 2.png 2.tif
convert -adaptive-resize 150% 3.png 3.tif
convert -adaptive-resize 150% 4.png 4.tif
convert -adaptive-resize 150% 5.png 5.tif
convert -adaptive-resize 150% 6.png 6.tif
convert -adaptive-resize 150% 7.png 7.tif
convert -adaptive-resize 150% 8.png 8.tif
convert -adaptive-resize 150% 9.png 9.tif

如果我从终端运行它,它就像一个魅力。 相反,如果我尝试从一个简单的 PHP 文件执行它,它不会创建任何 .tif 文件。

<?php
$exec = "./convertpngtif.sh";
exec($exec);
?>

【问题讨论】:

  • 做一个 var_dump($exec) 看看生成了什么,可能是空格的问题
  • string(56) "/opt/local/bin/convert -adaptive-resize 150% 1.png 1.tif"
  • 试试这些:error_reporting(E_ALL); var_dump($_SERVER); echo getcwd();,同时查看 apache 的 error.log。
  • 1.png 对用户 www-data 有读取权限吗?甚至在目录中有写权限? (用于创建新文件)(如果您在 linux 中)
  • 许可 . drwxrwxrwx,1.png的权限-rw-r--r--

标签: php macos permissions exec mamp


【解决方案1】:

此答案适用于 LINUX/MAC

我知道这是一个老问题 - 但我遇到了类似的问题。 一种在没有路径问题的情况下执行 shell 命令的方法是 创建一个新的登录外壳 使用

/bin/bash -l 

所以 bash 就像它是一个登录 shell,并且所有路径信息都已设置。 使用 -c 将命令添加为字符串

$exec = "/bin/bash -lc 'convert -adaptive-resize 150% ".$pos.".png".$pos.".tif'";
exec($exec,$out,$rcode);

您可以使用它来获取转换路径

/bin/bash -lc 'which convert' 

在没有 bash 部分的情况下工作

仍然需要设置转换的权限,并且 允许运行 php 的用户登录。 所以必须设置 /etc/passwd (ubuntu/debian) 中的登录 shell

【讨论】:

    【解决方案2】:

    我会先打印错误信息来诊断错误:

    $out, $ret;
    $exec = "/opt/local/bin/convert -adaptive-resize 150% ".$pos.".png ".$pos.".tif 2>&1";
    exec($exec, $out, $ret);
    var_dump($out);
    

    正如其他人所说,由于权限问题,imagemagick 很可能会停止从 exec() 运行,即使它可以从 CLI 正常运行。

    【讨论】:

      【解决方案3】:

      线索在上面的 Hieu Nguyen 回答中:当您使用 PHP -r 从命令行运行时,它可以工作。当您在浏览器中运行时,它不会。这会导致三个可能的问题之一。

      要记住的关键是,当您运行 exec 时,脚本、用户、路径和工作目录将以运行 PHP 的相同用户/权限运行。

      在命令行中运行 PHP 时,PHP 将以您登录的用户(“you”)运行,因此 exec() 也将运行“you”。这也将是您用于编写 shell 脚本的同一用户。因此权限与您的相同,并且可以正常工作(很棒)。

      当 PHP 在 Apache(或 IIS)中运行时,它可能是也可能不是“你”。在您的情况下,这显然不是因为脚本不起作用 - PHP 可能以“apache”或“http”或“www”或类似名称的用户身份运行。

      这会导致三个可能的问题之一。那么要检查什么:

      1) 和 2) 路径和工作目录。

      上面建议一次一个,但是为所有文件(可执行命令、输入文件和输出文件)规定绝对路径(即完整路径,从根 / 开始)更安全。这排除了可能出现的路径或工作目录的任何差异。如果您使用 shell 脚本,请规定 shell 脚本的完整路径和其中的完整路径(或在顶部设置路径/目录)

      3) 权限

      上面再次建议,但每个人都专注于文件。但是您检查过convert 可执行命令本身的权限吗?

      同样使用 shell 脚本,您是否将其权限设置为 PHP 正在运行的用户的可执行权限? rwxr--r-- 如果您在 apache 中以不同用户身份运行,则“您”拥有的 rwxr--r- 并不令人满意。

      如果遇到这些问题,还有其他几个解决方案:

      1. 即使在 Apache 中使用 fastCGI 安装,您也可以让 PHP 以“您”的身份运行。这样,您就知道运行两个 PHP 脚本的用户/路径/工作目录。 (我仍然建议使用完整路径,但仍然可以缓解权限问题)

      2. 您可以通过以“apache”或“www”或“http”等身份登录并设置权限/路径来调试脚本,以便您的脚本现在可以工作。

      【讨论】:

        【解决方案4】:

        你也可以尝试这样在 PHP 中执行 shell 脚本:

        <?php echo shell_exec('sh ./convertpngtif.sh');  ?>
        

        <?php
        $exec = file_get_contents("./convertpngtif.sh");
        echo shell_exec($exec);
        ?>
        

        【讨论】:

          【解决方案5】:

          如何使用临时目标文件

          $source = dirname( __FILE__ ) . '/' . $pos.".png";
          $target = tempnam( '/tmp/', 'tif-' );
          rename( $target, $target . '.tif' );
          $target .= '.tif';
          
          $command = '/opt/local/bin/convert';
          
          assert( file_exists( $command ));
          assert( file_exists( $source ));
          assert( is_readable( $source ));
          assert( ! file_exists( $target ));
          
          $exec = $command . " -adaptive-resize 150% ". escapeshellarg( $source ) . " " . escapeshellarg( $target );
          exec( $exec );
          

          【讨论】:

            【解决方案6】:

            我会为此使用 PHP imagemagick 的界面。像这样的:

            <?php
            $image = new Imagick( "image.png" );
            $height=$image->getImageHeight()*1.5; // 150% size
            $width=$image->getImageWidth()*1.5;  // 150% size
            $image->resizeImage( $width, $height,  imagick::FILTER_LANCZOS, 1 );
            $image->setImageFormat( "tif" );
            $image->writeImage( "image.tif" );
            $image->clear(); 
            $image->destroy(); 
            ?>
            

            【讨论】:

              【解决方案7】:

              这对我来说似乎是一个权限问题。首先,您需要在终端上使用system() 而不是exec()(以获得完整输出)来调试您的php调用:

              php -r 'system("/opt/local/bin/convert -adaptive-resize 150% 1.png 1.tif");'
              

              我敢打赌,你会看到确切的错误。我认为有两种情况:

              • 目标文件夹没有写入权限,在这种情况下,您可能需要将该文件夹的权限更改为 777。

              • /opt/local/bin/convert 没有执行权限,在这种情况下,您必须检查从/opt/opt/local 等每个文件夹的权限,并赋予每个文件夹至少755 的权限。

              在这两种情况下,使用ls -la 获取每个文件夹的权限。

              希望这会有所帮助。

              【讨论】:

              • 当我运行这个命令时,一切都按预期工作,并创建了 tif 文件。它没有给我任何错误。
              【解决方案8】:

              看看你是否有正确的写权限。

              在 linux 中,Apache 服务器的常用用户名是 www-data

              在控制台中:

              cd /var/www (or where you are saving your php files)
              ls -la (You will see permissions)
              sudo chown www-data:youruser thisfolder (change primary user to www-data and group to youruser)
              sudo chmod 775 thisfilder (change permissions, write read exec for user and usergroup and read for others.
              

              【讨论】:

              • 所以,如果我的用户名是 Giorgio。我会输入: sudo chown www-data:Giorgio thisfolder ?我试图输入路径而不是“thisfolder”。但我得到这个错误 chown: Giorgio : invalid argument.
              • 在控制台中写入groupsgroups giorgio 以查看您的gid 信息。 stackoverflow.com/questions/350141/…
              • 对不起,如果我再次问豪尔赫。当我键入组时,我得到“staff com.apple.sharepoint.group.1 _lpadmin _appserveradm _appserverusr admin”。我现在该怎么办?
              • 也许您来自小组工作人员或管理员。没关系,重要的是apache的www-data,不知道Mac中是否有变化。要测试你可以只给文件夹和文件 777 权限(chmod -R 777 thefolder)而不用 chown
              【解决方案9】:

              据我所知,您正在尝试使用 ImageMagick 来转换图像。

              PHP 有一个需要安装的Imagick 库。如果你有root权限,你可以很容易地做到这一点,并使用imagick库包装函数来转换图像(无需运行命令行)。

              Here is the documentation to php Imagick

              如果安装了 imagick,您可以通过 phpinfo(); 检查。

              【讨论】:

              • Imagick 只不过是可执行文件的包装,OP 问题应该仍然存在......
              • 它不是可执行文件的包装。如果你阅读 Imagick 的源代码(你可以,因为它是开源的),你会看到。 (github.com/mkoppanen/imagick)
              【解决方案10】:

              考虑使用 php imagick 代替 exec 函数。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2021-08-05
                • 1970-01-01
                • 2014-05-17
                • 2011-09-30
                • 1970-01-01
                • 1970-01-01
                • 2010-11-18
                相关资源
                最近更新 更多