我正在尝试使用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);
?>
答案 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--并不令人满意。
如果与这些人争吵,还有其他一些解决方案:
即使在使用fastCGI安装的Apache中,您也可以将PHP作为“您”运行。这样您就可以知道运行两个PHP脚本的用户/路径/工作目录了。 (我仍然建议使用完整路径,但仍然可以缓解权限问题)
您可以通过以“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 );