Php exec命令转换图像

时间:2013-07-15 12:47:53

标签: php macos permissions exec mamp

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

我带来的是:

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

如果我遇到“转换”的CLI,我会得到那条道路:/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);
?>

10 个答案:

答案 0 :(得分:6)

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

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

在命令行中运行PHP时,PHP将以用户身份(“你”)身份运行,因此exec()也将运行“你”。这也是您用来编写shell脚本的用户。因此权限与您的相同,并且它很有用(很棒)。

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

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

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

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

3)权限

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

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

如果与这些人争吵,还有其他一些解决方案:

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

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

答案 1 :(得分:2)

考虑使用php imagick代替 exec 功能。

答案 2 :(得分:2)

我会使用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(); 
?>

答案 3 :(得分:2)

此答案适用于LINUX / MAC

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

/bin/bash -l 

所以bash就像登录shell一样,并设置了所有的pathinfo。 使用-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

答案 4 :(得分:1)

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

PHP有一个Imagick库需要安装。如果您具有root访问权限,则可以轻松实现,并使用imagick库包装器函数转换图像(无需运行命令行)。

Here is the documentation to php Imagick

如果安装了imagick,您可以查看phpinfo();

答案 5 :(得分:1)

这对我来说似乎是一个许可问题。首先,您需要在终端上使用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获取每个文件夹的权限。

希望这有帮助。

答案 6 :(得分:1)

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

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

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

答案 7 :(得分:1)

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

$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正常运行,正如其他人所说的那样。

答案 8 :(得分:0)

查看您是否具有正确的写入权限。

在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.

答案 9 :(得分:0)

如何使用临时目标文件

$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 );
相关问题